JWT Token 저장소에 대한 심각한 고민과 나의 생각

HJ·2022년 5월 16일
3

Interview prep

목록 보기
12/12

'서버에서 발급해준 JWT Token을 클라이언트 사이드에서는 어디에 저장해야 할까?'라는 고민은 누구나 한번쯤 해봤을 것이라 생각한다.

솔직히 처음 백앤드 개발자 분들과 협업을 했을 때 Local strorage에 저장하는 것이 구현이 쉬웠기 때문에 그 다음에도 별 고민 없이 Local storage에 저장하곤 했었다.

근데 웹 스토리지(Local storage, Session storage)말고도 Cookie에 저장하는 방식도 있음을 알게 되었고, 그 다음 프로젝트에선 웹 스토리지와 Cookie의 특징과 장단점을 extensive하게 리서치 해보고, 고민한 끝에 Cookie에 저장하는 방식으로 구현했었다.

여전히 어느 저장소가 가장 보안적으로 뛰어나다/좋다와 같은 정답은 없다. 하지만 오늘은 나만의 결론?을 정리해보도록 하겠다.


웹 스토리지(Web storage)란?

  • 서버가 아닌, 클라이언트에 데이터를 저장할 때 사용하는 저장공간
  • Local Storage와 Session Storage가 있다.

Local Storage

  • 구현이 쉬움
  • 브라우저 자체에 반영구적으로 데이터를 저장함(http header에 넣어서)
  • 브라우저를 종료해도 데이터가 유지됨
  • 도메인만 같으면 전역적으로 데이터 공유가 가능

Session Storage

  • 각 세션마다 데이터가 개별적으로 저장됨
  • 각 세션마다 데이터가 개별적으로 저장세션을 종료하면 데이터가 자동으로 제거됨
  • 같은 도메인이라도 세션이 다르면 데이터에 접근할 수 없음

웹 스토리지의 단점?

  • XSS공격에 취약하다.
    XSS 공격은 당신의 웹사이트에서 공격자가 JavaScript를 실행할 수 있을때 발생한다. 이는 localStorage에 저장되어있는 당신의 access token을 공격자가 탈취할 수 있다는 말이다.

쿠키(Cookie)란?

  • 쿠키는 데이터를 4KB까지 저장하는 HTTP 통신의 무상태성을 보안해주기 위해 나온 공간이다.
  • 서버에서 접근이 가능하다.
  • HTTP Request시 자동으로 포함된다.

쿠키의 장점

  • XSS 공격에 취약하지 않다.
    쿠키는 Javascript로 접근이 불가능하다.
    해커가 공격하려는 웹사이트에서 Javascript를 실행한다고 했을 때, 쿠키의 httponly나 secure 옵션을 사용하면 악의적인 Script에서 Cookie를 가져올 수 없기 때문에 XSS공격에 방어가 된다. (Javascript 접근에 안전해진다는 뜻)

쿠키의 단점

  • 4KB의 작은 용량
  • API 서버가 쿠키를 사용할 수 없거나 access token을 authorization header에 넣어줘야 하는 경우에는 쿠키 사용이 불가능하다.
  • CSRF 공격(유저가 의도하지 않은 요청을 하도록 만드는 공격)에 취약하다.
    하지만, sameSite 플래그를 사용하고, anti-CRSF token을 사용한다면 방어가 가능하다.
    • SameSite strict
      해당 속성 설정 시 현재 페이지 도메인과 요청받는 도메인이 같아야만 쿠키가 전송되게 해서 방어가 가능하다.
    • Csrf Token
      임의의 난수(Csrf Token)를 생성해 서버 메모리(세션)에 저장하고 클라이언트에 전달한다.
      클라이언트는 중요한 요청(생성, 삭제, 수정)을 보낼 때 파라미터로 Csrf Token을 같이 보내 검증을 한다. 이렇게 했을 경우 CSRF 공격을 당해도 CSRF Token은 서버에 전달되지 않으므로 서버는 요청을 수행하지 않게 된다.

결론

쿠키는 CSRF 공격에 취약하고, 또 XSS 공격을 완벽하게 방어하는 것은 아니다.
하지만 JavaScript로 쉽게 접근이 가능한 웹 스토리지보다는 HttpOnly 옵션을 통해 JavaScript 차단이 가능한 Cookie가 조금 더 보안적인 면에서 낫다고 생각했다.
또한 sameSite 플래그와 anti-CSRF tokens를 사용한다면 CSRF 공격을 어느정도 예방시킬 수 있기 때문에 결론적으로 나는 쿠키에 저장하는 것을 선택했다.
또한 대부분 쿠키에 저장하는 것이 더 선호되는 편 같기도 하다..

몰론 본인 판단 하에 더 낫다고 생각하는 곳에 저장하시면 됩니다! 이 글은 정답이 아니랍니다. :)

출처: JUNHYUK CHOI 블로그
https://velog.io/@ppyooy336/JWT-Token-저장-위치
https://tofusand-dev.tistory.com/89
https://tofusand-dev.tistory.com/89

0개의 댓글