XSS는 수 년간 OWASP Top 10에서 사라지지 않는 취약점 중 하나이다. XSS의 주된 공격 타겟은 바로 Session Cookies 탈취라고 한다. 그래서 오늘은 이에 대응할 수 있는 SecureHttpOnly 옵션에 대해 정리하려 한다.

1. Secure

Secure는 웹 브라우저와 웹 서버가 HTTPS로 통신하는 경우에만 웹 브라우저가 쿠키를 서버로 전송하는 옵션이다.

OWASP Secure Cookie Flag

설정하는 방법은 다음과 같다.

JAVA (Servlet 3.0(Java EE 6))

  • web.xml
1
2
3
4
5
<session-config>
  <cookie-config>
    <secure>true</secure>
  </cookie-config>
</session-config>

Tomcat

  • Tomcat 6 이상

만약 첫 세션 요청이 https를 통해 이루어지는 경우, session cookie에 자동으로 secure가 설정

  • Tomcat 6 이전
1
2
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; secure");

.NET

  • web.config
1
2
3
<system.web>
  <httpCookies requreSSL="true"/>
</system.web>
  • ex)
1
2
3
<authentication mode="forms">
  <forms loginUrl="member_login.aspx" cookieless="useCookies" requireSSL="true" path="/MyApplication" />
</authentication>

Python(cherryPy)

  • configuration file에 추가
1
tools.sessions.secure = True

PHP

  • php.ini
1
session.cookie_secure = True

2. HttpOnly

HttpOnly는 자바스크립트의 document.cookie를 이용 해 쿠키에 접속하는 것을 막는 옵션이다.

OWASP HttpOnly

설정하는 방법은 다음과 같다.

JAVA (Servlet 3.0(Java EE 6))

  • JAVA 코드 내에서
1
2
Cookie cookie = getMyCookie("myCookieName");
cookie.setHttpOnly(true);
  • /WEB-INF/web.xml
1
2
3
4
5
<session-config>
  <cookie-config>
    <http-only>true</http-only>
  </cookie-config>
</session-config>
  • JAVA EE 6 이전
1
2
3
// JSESSIONID에 다른 flag가 세팅되어 있을 수도 있으므로, 확인 후 설정
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");

Tomcat

  • Tomcat 6 이상
1
2
<?xml version="1.0" encoding="UTF-8">
<Context path="/myWebApplicationPath" useHttpOnly="true">

.NET

  • web.config
1
2
3
<system.web>
  <httpCookies httOnlyCookies="true"/>
</system.web>

Python(cherryPy)

  • configuration file에 추가
1
tools.sessions.httponly = True

PHP

  • php.ini
1
session.cookie_httponly = True

3. 설정 적용 확인하기

만약 cookie 값에 secureHttpOnly가 설정되어 있는지 손쉽게 확인하고 싶다면 EditThisCookie라는 크롬 확장 프로그램을 이용하면 된다.

EditThisCookie

아래는 한 사이트에서 EditThisCookie를 이용하여 cookie 값을 확인 해 본 것이다.

하단의 옵션을 확인해 본 결과 해당 사이트에서는 HttpOnly 옵션은 적용되어 있지만 Secure 옵션은 적용되어 있지 않은 것을 알 수 있다. 따라서 아래와 같이 document.cookie를 사용하면 cookie의 값이 나타나지 않는다.

하지만 Secure 옵션이 적용되어 있지 않기 때문에, HTTP 환경에서도 이 cookie 값을 전달할 수 있다.