All Articles

JWT 토큰 + 어디에 저장할까?

JWT & 토큰 저장소

JWT: Json Web Tokens

  • Self-contained: 토큰에 대한 기본정보, 전달할 정보, 토큰이 검증 되었다는 증명인 signature 포함
"dBjftJeZ4CVP.mB92K27uhbUJU1p1r.wW1gFWFOEjXk…"

이런 토큰의 형태를 디코딩하면:

{
  "iss": "http://galaxies.com",
  "exp": 1300819380,
  "scopes": ["explorer", "solar-harvester", "seller"],
  "sub": "tom@andromeda.com"
}
  • sub(subject): 이 사람이 누구인지
  • scopes(접근범위): 이 토큰을 가지고 어디에 접근할 수 있는지
  • exp: 언제 만료되는지
  • iss(issuer): 누가 이 토큰을 발급했는지

어디에 저장해야 할까?

  • HTML5 Web Storage (local/session)
  • 쿠키
  • Web Storage 저장

더 간단한 방법.

localStorage.setItem('access_token',response.body.access_token)

보안 상 문제: 사이트에서 동작하는 자바스크립트 사용해서 접근할 수 있다

XSS (cross-site scripting)에 취약할 수 있다

누군가가 내 페이지에서 동작하는 자바스크립트를 삽입하면 보안상 문제 발생할 수 있음

Web Storage does not enforce any secure standards during transfer. Whoever reads Web Storage and uses it must do their due diligence to ensure they always send the JWT over HTTPS and never HTTP.

  • 쿠키에 저장

Set-Cookie

js-cookies 같은 라이브러리 사용

보안:

HttpOnly cookie flag와 함께 사용하면 자바스크립트로 접근 불가능하고 XSS도 막을 수 있음. 전통적으로 쿠키의 상태는 서버에 저장되어야 했으나 JWT는 그럴 필요가 없다고 함

Cookies as a storage mechanism do not require state to be stored on the server if you are storing a JWT in the cookie. This is because the JWT encapsulates everything the server needs to serve the request.

CSRF(Cross-site request forgery) 공격에 취약함

  • 실제 사용자가 의도하지 않은 request를 보내느 방식의 취약점 공격 방식

    • 사용자가 A 사이트에 가입되어있고 로그인 유지하고 있을 때 악성 공격을 하는 B사이트에 접속하면 스크립트를 통해 사용자 몰래 A에 악의적인 요청을 보내는 방식
  • XSS는 사용자를 믿는 점에 대한 취약점을 노리는 반면 CSRF는 사용자의 browser를 신뢰하는 것에 대한 취약점을 노려서 공격

옵션 설정 통해 자바스크립트 조작 방지

  • HttpOnly: 자바스크립트로 접근 불가 (XSS 공격 방어)
  • Secure 옵션: HTTPS 통신

CSRF에 대응하기 위해 ‘Synchronizer Token’ 쓸 필요성 ???

CSRF 토큰을 만들어서 double checking을 통해 보안에 신경 쓸 필요가 있다.

CSRF 토큰을 서버사이드에서 제공해주어야 (Per-reqeust 토큰)

쿠키 통해서 요청 가면 안되고, request header에 넣어 요청하거나 hidden field로 요청

custom request header 사용하는게 더 안전

<form action="/transfer.do" method="post">
<input type="hidden" name="CSRFToken" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZMGYwMGEwOA==">
[...]
</form>

Curie Yoo