JWT-2
JWT-2
JWT
- JSON 데이터를 Base64 URL-safe 인코딩해서 직렬화한 토큰
- JSON 데이터는 Header, Payload, Signature 세 부분으로 구성됨
- 각 부분은
.
으로 구분됨
JWT의 JSON 데이터 구조
- Header
- alg와 type으로 구성됨
- alg는 서명에 적용될 해시 알고리즘을 나타냄 (SHA256, HS512 등)
- type은 이 토큰의 타입을 나타냄.
JWT
라고 표시
- Payload
- 서버에서 첨부한 사용자 및 토큰 관련 정보를 저장하는 곳
- 하나의 key-value 형태의 데이터 조각을 claim이라고 함
- 한 토큰에 여러 claim을 넣을 수 있으며, 사용자 ID, 유효기간, JWT 발급자 등의 정보가 해당됨
- 중요한 정보를 담으면 안됨
- Signature
- 올바른 token인지 확인하기 위한 값. 다음과 같이 생성됨
- Header, Payload를
.
으로 결합해 인코딩 함 - 이후 header에 명시된 해시함수와 개인 키를 이용하고 다시 인코딩해서 signature를 얻음
JWT 저장 위치
Web storage
- 브라우저 내에 Local storage와 Session storage라는 저장소가 있음
- 여기에 JWT를 저장하면 서버가 HTTP를 이용해 접근이 불가능
- 자바스크립트로 접근이 가능하기 때문에 XSS 등의 공격에 취약
쿠키
- Web storage와 달리 쿠키에 저장하면 서버에서 접근이 가능
- HttpOnly 설정을 통해 자바스크립트의 접근을 막을 수 있음 (XSS 차단, 탈취 가능성 감소)
- Secure 옵션을 통해 HTTPS로만 전송되게 해 보안 수준을 높일 수 있음
- CSRF 공격에 위험성이 생기나, 서버에서 CORS 설정을 통해 방지 가능
References
- https://velog.io/@ppyooy336/JWT-Token-%EC%A0%80%EC%9E%A5-%EC%9C%84%EC%B9%98
- https://pronist.dev/143
- https://tofusand-dev.tistory.com/89#token-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D-%EB%B0%A9%EC%8B%9D
- https://velog.io/@bey1548/JWTJson-Web-Token