XSS는 수 년간 OWASP Top 10에서 사라지지 않는 취약점 중 하나이다.
XSS의 주된 공격 타겟은 바로 Session Cookies 탈취라고 한다.
그래서 오늘은 이에 대응할 수 있는 Secure 와 HttpOnly 옵션에 대해 정리하려 한다.
1. Secure
Secure는 웹 브라우저와 웹 서버가 HTTPS로 통신하는 경우에만 웹 브라우저가 쿠키를 서버로 전송하는 옵션이다.
OWASP Secure Cookie Flag
설정하는 방법은 다음과 같다.
JAVA (Servlet 3.0(Java EE 6))
1
2
3
4
5
|
<session-config>
<cookie-config>
<secure>true</secure>
</cookie-config>
</session-config>
|
Tomcat
만약 첫 세션 요청이 https를 통해 이루어지는 경우, session cookie에 자동으로 secure가 설정
1
2
|
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; secure");
|
.NET
1
2
3
|
<system.web>
<httpCookies requreSSL="true"/>
</system.web>
|
1
2
3
|
<authentication mode="forms">
<forms loginUrl="member_login.aspx" cookieless="useCookies" requireSSL="true" path="/MyApplication" />
</authentication>
|
Python(cherryPy)
1
|
tools.sessions.secure = True
|
PHP
1
|
session.cookie_secure = True
|
2. HttpOnly
HttpOnly는 자바스크립트의 document.cookie를 이용 해 쿠키에 접속하는 것을 막는 옵션이다.
OWASP HttpOnly
설정하는 방법은 다음과 같다.
JAVA (Servlet 3.0(Java EE 6))
1
2
|
Cookie cookie = getMyCookie("myCookieName");
cookie.setHttpOnly(true);
|
1
2
3
4
5
|
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
|
1
2
3
|
// JSESSIONID에 다른 flag가 세팅되어 있을 수도 있으므로, 확인 후 설정
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
|
Tomcat
1
2
|
<?xml version="1.0" encoding="UTF-8">
<Context path="/myWebApplicationPath" useHttpOnly="true">
|
.NET
1
2
3
|
<system.web>
<httpCookies httOnlyCookies="true"/>
</system.web>
|
Python(cherryPy)
1
|
tools.sessions.httponly = True
|
PHP
1
|
session.cookie_httponly = True
|
3. 설정 적용 확인하기
만약 cookie 값에 secure와 HttpOnly가 설정되어 있는지 손쉽게 확인하고 싶다면 EditThisCookie라는 크롬 확장 프로그램을 이용하면 된다.
EditThisCookie
아래는 한 사이트에서 EditThisCookie를 이용하여 cookie 값을 확인 해 본 것이다.

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

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