공부 및 일상기록

[네트워크] JWT토큰을 쿠키에 저장했을 때 취약점 본문

개발/네트워크

[네트워크] JWT토큰을 쿠키에 저장했을 때 취약점

낚시하고싶어요 2023. 1. 12. 23:59

JWT

Json Web Token의 약자로 사용자의 인증을 위해서 사용하는 암호화된 토큰을 의미한다.

JWT정보를 request에 담아 사용자의 정보열람, 수정 등 개인적인 작업들을 수행할 수 있다.

 

JWT는 개인정보와 같다.

보안 관련 대책이 없이 JWT를 아무 곳에나 저장하면 사용자의 정보를 가져가도 상관없다는 의미와 같다.

JWT를 private variable에만 저장하면 안될까?

UX상 좋지가 않다. 자바스크립트 변수는 웹페이지를 새로고침하면 사라지는 휘발성이다.

JWT를 프라이빗 변수에 저장하는것이 안되는것은 아니지만 사용자 입장에서 새로고침할때마다 새로 로그인을 해야하는 문제를 겪어야 할 수도 있다. 매우 불편하게 된다. 따라서 프라이빗 변수에만 저장하는 방법은 피해야 한다.

 

그럼 어디에 저장해야 하나?

1. localStorage에 저장

장점

  • CSRF 공격에는 안전하다.
  • 그 이유는 자동으로 request에 담기는 쿠키와는 다르게 JS코드에 의해 헤더에 담기므로 XSS를 뚫지 않는 이상 공격자가 정상적인 사용자인척 request를 보내기가 어렵다.

단점

  • XSS에 취약하다.
  • 공격자가 localStorage에 접근하는 JS 코드 한줄만 주입하면 내 localStorage를 내집처럼 드나들 수 있다.

 

2. cookie에 저장

장점

  • XSS공격으로부터 localStorage에 비해 안전하다.
  • 쿠키의 httpOnly 옵션을 사용하면 JS에서 쿠키에 접근 자체가 불가능하다.
  • 따라서 XSS공격으로 쿠키 정보를 탈취할 수 없다.
  • httpOnly 옵션은 서버에서 설정할 수 있다.

 

  • 하지만 XSS공격으로부터 완전히 안전한 것은 아니다.
  • httpOnly 옵션으로 쿠키의 내용을 볼 수 없다 해도 JS로 request를 보낼 수 있으므로 자동으로 request에 실리는 쿠키의 특성상 사용자의 컴퓨터에서 요청을 위조할 수 있기 때문이다.
  • 공격자가 번거로울 뿐, XSS가 뚫린다면 httpOnly cookie도 안전하지 않다.

 

단점

  • CSRF 공격에 취약하다.
  • 자동으로 http request에 담아서 보내기 때문에
  • 공격자가 request url만 안다면 사용자가 관련 link를 클릭하도록 유도하여 request를 위조하기 쉽다.
  • 최근에는 쿠키의 CSRF 취약점을 막기 위해 쿠키의 same-site 속성과 JS의 fetch api속성의 기본값 등으로 request에 쿠키를 싣지 않음 이 설정되어 있다.

 

결론

가장 좋은 방법

refresh token을 사용하는 방법이 있다.

refresh token을 httpOnly 쿠키로 설정하고

url이 새로고침 될 때마다 refresh token을 request에 담아

새로운 access token을 발급 받는다.

발급받은 access token은 자바스크립트 프라이빗 변수에 저장한다.

 

이런 방식을 사용하게 되면 refresh token이 CSRF에 의해 사용된다 하더라도

공격자는 access token을 알 수 없다.

CSRF는 피해자의 컴퓨터를 제어할 수 있는것이 아니기 때문이다.

요청을 위조하여 피해자가 의도하지 않은 서버 동작을 일으키는 공격 방법이기 때문에

refresh token을 통해 받아온 response(access token)은 공격자가 확인할 수 없다.

 

따라서 쿠키를 사용하여 XSS를 막고 refresh token방식을 사용하여 CSRF를 막을 수 있다.

 

 

XSS(cross site scripting)

XSS라고 불리는 이유는 CSS가 이미 사용중인 이름이기 때문이다.

code injection attack이라고도 한다.

XSS도 다양한 공격방법이 있지만

공격자가 의도하는 악의적인 JS 코드를 피해자 웹 브라우저에서 실행시키는 방법

정도로 생각하면 된다. 이 방법으로 피해자 브라우저에 저장된 중요 정보들을 탈취한다.

 

CSRF(Cross site request forgery)

정상적인 request를 가로채 피해자인척 하고 백엔드 서버에 변조된 request를 보내 악의적인 동작을 수행하는 공격을 의미한다. (피해자 정보 수정, 정보 열람 등)

공격방법

1. 요청 url을 알고있는 공격자는 유저가 img를 열람하도록 하거나 link를 클릭하도록 유도한다.

2. 이 action은 사용자 의도와 관계없이 http request를 보낸다.

3. 유저가 로그인이 되어있는 상태라면 이 request는 정상적으로 서버에서 동작을 수행한다.

'개발 > 네트워크' 카테고리의 다른 글

[네트워크] SEO란 무엇인가?  (0) 2023.01.18
[네트워크] 토큰기반 인증방식  (0) 2023.01.13
[네트워크] 웹 프로토콜  (0) 2023.01.09
[네트워크] TCP 3 Way HandShaking  (0) 2023.01.09
[네트워크] TCP와 UDP  (0) 2023.01.09