본문 바로가기
👨‍🏫일문일답

AJAX 사용 시 CSRF 토큰 쿠키 httpOnly 옵션 사용 여부?

by 캔 2024. 3. 17.

CSRF 방어에 대해 공부하면서 안전한 CSRF 저장 방식과 사용 방식에 대한 고민을 하게 되었다.

 

스프링에서 제공하는 CSRF 저장소에는 세션과 쿠키 두 가지가 있는데, 전자를 사용할 경우 세션에서 토큰을 꺼내서 폼에 토큰을 추가하여 클라이언트에 전달하게 되고, 후자를 사용하게 될 경우 토큰을 쿠키에 담아 클라이언트에게 전달하게 된다. 세션을 사용하게 되면 토큰 값이 노출되고 뷰에 토큰을 삽입하는 코드를 작성해야 해서, 쿠키를 사용하는 것이 더 안전하고 편리해 보였다. 따라서 쿠키 방식을 사용하기로 정하였다.

 

이 경우, 스프링 시큐리티의 기본값이 세션 저장 방식이기 때문에 쿠키 저장 방식으로 설정을 바꿔줘야 한다. 그러고 나서 httpOnly 옵션을 false로 설정할 것인가 말 것인가를 선택해야 하는데 이때부터 깊은 고민이 시작됐다. httpOnly를 해제할 경우 보안성이 떨어지지 않을까 하는 우려에서였다. httpOnly 옵션은 자바스크립트가 쿠키의 내용에 접근하거나 조작하지 못하도록 한다. 그런데 이것을 설정하면 XSS 발생 시 문제가 되지 않을까 싶었다. 

 

그러던 중 검색을 통해서 CSRF 쿠키의 httpOnly 옵션 사용에 대한 논의와 장고의 공식 문서 내용을 보게 되었다.

 

CSRF(Cross-Site Request Forgery) 쿠키를 HttpOnly로 지정하는 것은 실제로 어떤 실질적인 보호도 제공하지 않습니다. 왜냐하면 CSRF는 오직 도메인 간 공격에 대한 보호를 위한 것이기 때문입니다. 만약 공격자가 JavaScript를 통해 쿠키를 읽을 수 있다면, 브라우저의 관점에서 이미 동일한 도메인에 있으므로 그들은 원하는 대로 어떤 작업이든 할 수 있습니다. (XSS가 CSRF보다 훨씬 큰 보안 허점입니다.)

- 장고 핵심설정 중 CSRF_COOKIE_HTTPONLY 옵션 설명(https://django.readthedocs.io/en/stable/ref/settings.html#csrf-cookie-httponly)

 

XSS 공격 발생 시에 CSRF 토큰 쿠키에 대해 httpOnly를 설정하는 것이 의미가 없다는 것이었다. 왜냐면 httpOnly는 XSS를 통해 삽입된 자바스크립트 실행으로 쿠키에 접근하는 것을 막기 위해 설정하는 것인데 XSS 공격으로 자바스크립트 사용이 가능해졌다면 무엇이든 가능한 상황이기 때문이다. 즉, httpOnly는 XSS를 대비한 것이지 CSRF는 보호해 주지 못한다는 것이다. httpOnly 옵션을 해제했다면 자바 스크립트로 쿠키에 접근해서 토큰 획득 후 요청을 보내면 된다.

 

이런 점을 고려했을 때, httpOnly 설정 시에 이점이 미약하고 httpOnly 설정 시 자바스크립트를 사용한 데이터 전송이 불가하므로 httpOnly 옵션을 해제하는 것이 AJAX 사용 혹은 Angular나 React 등 자바스크립트 프레임워크 사용도 가능해서 설정하지 않는 편이 더 낫다고 판단하였다.

 

+ 추가적으로 CsrfTokenRepository에는 아예 withHttpOnlyFalse()라는 스태틱 팩토리 메서드가 있으며 true 사용 시에는 객체 자체를 새로 생성해서 사용해야 한다.

 

참조: https://security.stackexchange.com/questions/175536/does-a-csrf-cookie-need-to-be-httponly

 

Does a CSRF cookie need to be HttpOnly?

We were recently handed a security report containing the following: Cookie(s) without HttpOnly flag set vulnerability, which we apparently had in one of our internal applications. The applied fix...

security.stackexchange.com

 

https://django.readthedocs.io/en/stable/ref/settings.html#csrf-cookie-httponly

 

Settings — Django 5.0.3 documentation

Here’s a list of settings available in Django core and their default values. Settings provided by contrib apps are listed below, followed by a topical index of the core settings. For introductory material, see the settings topic guide. CSRF_COOKIE_DOMAIN

django.readthedocs.io

 

 

'👨‍🏫일문일답' 카테고리의 다른 글

Concurrency Issue and Thread-safety  (0) 2024.04.06
무중단 배포(zero-downtime deployment)  (1) 2024.03.04
프로세스 스케쥴링 방식  (0) 2024.01.29
프로세스 스케쥴링  (0) 2024.01.29
트랩  (0) 2024.01.29