JWT 토큰을 어디에 저장해야 하는가? 2

mokyoungg·2021년 2월 4일
0

store token

목록 보기
5/7

이 글은 스택오버 플로우에 올라온 질문을 번역한 글입니다.
Where to store JWT in browser? How to protect against CSRF?

모든 출처는 다음과 같습니다.
https://stackoverflow.com/questions/27067251/where-to-store-jwt-in-browser-how-to-protect-against-csrf


질문

쿠키 기반 인증을 알고 있습니다.
SSL 및 HttpOnly 플래그를 적용하여 MITM 및 XSS로부터 쿠키기반 인증을 보호할 수 있습니다.
그러나 CSRF로부터 보호하기 위해서는 더 특별한 조치가 필요할 것 같습니다.

최근에 JWT 인증 솔루션이 꽤 뜨겁다는 것을 알게 되었습니다. JWT 인코딩, 디코딩 및 확인에 대해 알고 있습니다.
그러나 일부 웹사이트/튜토리얼에서 JWT를 사용하는 경우, CSRF 보호가 필요하지 않은 이유에 대해선 이해할 수 없었습니다.
JWT의 큰 그림을 제공하고 제가 가진 JWT 에 대한 오해에 대해 명확하게 알게 되길 바랍니다.

  1. JWT가 쿠키에 저장되어 있으면 서버가 쿠키/토큰을 확인하기 위해 세션을 가질 필요가 없다는 점을 제외하면 쿠키 기반 인증과 동일하다고 생각합니다. 특별한 조치가 실행되지 않으면 CSRF에 대한 위험은 여전히 존재합니다.
    JWT는 쿠키에 저장하지 않습니까?

  2. JWT가 localStorage / sessionStorage에 저장되어 있으면 쿠키가 없으므로 CSRF로부터 보호할 필요가 없습니다. 문제는 JWT를 서버로 보내는 방법입니다. 제가 발견한 곳에선 HTTP header AJAX 요청에 의해 JWT를 보낼때 jQuery를 사용하라고 제안합니다. 그렇다면 AJAX 요청만으로 인증을 수행할 수 있습니까?

  3. 또한 'Autorization header'와 'Bearer'를 사용하여 JWT를 보내는 글을 찾았습니다.
    블로그에서 말하는 방법을 이해하지 못했습니다. "Authorization header'와 'Bearer'에 대해 설명해주시겠습니까?
    이것이 모든 요청의 HTTP 헤더에 의해 JWT가 전송되도록 해야합니까? 그렇다면 CSRF는 문제는 어떻게 되는 건가요?


가장 많은 투표를 받은 3가지의 답변

1번

JWT 토큰은 OAuth 2.0 및 OpenID Connect 와 같은 새로운 인증 및 인증 프로토콜에서 기본 토큰형식으로 사용되기 때문에
널리 사용됩니다. 토큰이 쿠키에 저장되면 브라우저는 각 요청과 함께 자동으로 동일한 도메인으로 전송하며 이는 여전히 CSRF 공격에 취약합니다.

Bearer 인증은 HTTP에 정의 된 인증 체계 중 하나입니다.
기본적으로 You 요청의 Authorization HTTP 헤더에 토큰을 고정하는 것을 의미합니다. 브라우저는 이 작업을 자동으로 수행하므로 웹 사이트를 보호하는데 적합하지 않습니다. 브라우저가 요청에 헤더를 자동으로 추가하지 않기 때문에 도메인에 자동으로 제출되는 인증 정보에 의존하는 CSRF 공격에 취약하지 않습니다.
베어러 체계는 AJAX 호출을 통해 또는 모바일 클라이언트에서 사용되는 웹 API를 보호하는 데 자주 사용됩니다.


2번

클라이언트 컴퓨터에 JWT를 저장해야합니다.
localStorage / sessionStorage에 저장하면 XSS 공격에 쉽게 잡힐 수 있습니다. 쿠키에 저장하면 해커가 CSRF 공격으로 사용자로 가장하여 API를 호출, 작업을 수행하거나 정보를 가져오도록 요청할 수 있습니다.

쿠키에서 JWT를 쉽게 도난 당하지 않도록 보호하는 방법에는 여러가지가 있습니다. 그러나 localStorage / sessionStorage에 의존한다면 간단한 XSS 공격으로도 접근이 가능합니다.

따라서 CSRF 문제를 해결하기 위해 응용 프로그램에서 Double Submit Cookies를 사용합니다.

이하 생략.


3번

2020년에는 CSRF를 무력화하기 위해 SameSite = strict 로 JWT 토큰을 쿠키에 저장하기만하면 됩니다.
이 방법의 유일한 문제는 Safari 14 이상에서 사용할 수없으며 웹 위젯에 대한 교차 사이트 쿠키가 필요할 때 크롬에서 사용할 수 없다는 점.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite


스토리지에 저장하면 XSS 공격에 취약하다.
쿠키에 저장하면 XSS 공격에 대비가 되지만 CSRF 공격에 취약하다.

profile
생경하다.

1개의 댓글

comment-user-thumbnail
2022년 9월 6일

Redis에 저장하는 것도 마찬가지인가요?

답글 달기