1. JWT 란
JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.
위는 JWT 공식 웹페이지 https://jwt.io/introduction 에서 가져온 내용이다. 굵은 글씨를 보면, 서명되었기 때문에 유효하다고 인증할 수 있다고 한다. 여기서 JWT는 정보 보안을 목적으로 하는 암호화된 토큰이 아닌, 데이터의 유효성 인증을 위한 토큰임을 알 수 있다.
그렇다면, 서버는 어떻게 클라이언트가 보낸 JWT가 유효한지 검증할 수 있을까? 이를 알기 위해 JWT의 구조를 먼저 알아야 한다.
2. JWT 구조
- Header
- Payload
- Signature
JWT는 헤더, 페이로드, 시그니처 세 가지로 구성된다. 각 파트에 대해 알아보자.
- Header
- typ: 이 토큰의 유형은 무엇인지 (JWT 고정)
- alg: JWT가 어떤 알고리즘을 사용하여 서명을 암호화했는지
- Base64Url 인코딩 된다.
- Payload
- 토큰 만료 기한, 발행 주체, 사용자의 정보 등을 claims로 제공한다.
- Base64Url 인코딩 된다.
- Signature
- Header와 Payload를 서버만이 알고 있는 secret 키를 통해 헤더에서 지정한 알고리즘으로 암호화한다.
- Base64Url 인코딩 된다.
JWT 토큰의 헤더와 페이로드는 단순히 Base64Url 인코딩만 거치므로, 누구든지 다시 디코딩하여 데이터를 얻을 수 있다. 그래서 header와 payload 에는 민감한 정보를 담아서는 안된다. 잊지 말자. JWT의 목적은 데이터의 보안이 아닌, 서명 검증을 통한 데이터의 유효성 검증이다.
데이터의 유효성 검증은 Signature 파트를 통해 진행된다. 서버는 클라이언트로부터 전달 받은 JWT에서 Header와 Payload를 각각 Base64Url 디코딩을 통해 데이터를 파싱하고, 이 둘을 서버 자체가 갖고 있는 secret 키로 헤더에서 지정한 알고리즘으로 암호화 한다. 그리고 이를 JWT의 Signature 파트와 비교하여 일치하다면 토큰이 유효함을, 아니라면 유효하지 않음을 검증할 수 있다.
'개발 > DevOps' 카테고리의 다른 글
[Network] HTTP 상태코드 (0) | 2024.01.30 |
---|