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
값을 전달할 수 있다.