JWT (JSON Web Token)의 원리는 디지털 서명과 토큰 기반 인증 메커니즘에 기반합니다. JWT는 주로 사용자 인증과 정보 전달에 사용되며, 세 가지 주요 부분으로 구성되어 있습니다: 헤더(Header), 페이로드(Payload), 그리고 서명(Signature). 아래에서 각 부분의 역할과 전체적인 JWT의 작동 원리를 설명하겠습니다.
1. 헤더(Header)
- 타입: 보통
JWT
로 지정합니다.
- 알고리즘: 서명에 사용되는 알고리즘을 명시합니다. 예를 들어,
HMAC SHA256
또는 RSA
.
2. 페이로드(Payload)
- 클레임(Claims): 클레임은 토큰에 대한 세부 정보를 담고 있으며, 세 가지 유형이 있습니다:
- 등록된 클레임(Registered claims): 서비스에서 일반적으로 사용하는 클레임으로, 예를 들어 사용자 ID, 토큰 발급자(iss), 유효기간(exp) 등이 있습니다.
- 공개 클레임(Public claims): 충돌을 방지하기 위해 IANA JSON Web Token Registry에 등록할 수 있으며, 사용자 정의 클레임입니다.
- 비공개 클레임(Private claims): 서버와 클라이언트 간의 협상을 통해 사용되는 사용자 정의 클레임입니다.
3. 서명(Signature)
- 헤더와 페이로드를 서버의 비밀 키로 암호화하여 생성합니다. 이 서명은 토큰의 무결성을 보장하고 토큰이 중간에 변조되지 않았음을 확인하는 데 사용됩니다.
작동 원리
- 토큰 생성: 서버는 사용자의 인증 정보를 검증한 후, 헤더와 페이로드를 정의하고, 이들을 합쳐 서명하여 JWT를 생성합니다.
- 토큰 전송: 생성된 JWT는 클라이언트(예: 웹 브라우저)에 전송됩니다.
- 토큰 사용: 클라이언트는 이후의 요청에 이 토큰을 포함시켜 서버에 보냅니다. 일반적으로 HTTP 요청의
Authorization
헤더를 통해 전송됩니다.
- 토큰 검증: 서버는 요청과 함께 받은 JWT의 서명을 검증하고, 유효하다면 요청을 처리합니다.
장점과 단점
- 장점: 상태를 유지하지 않는(stateless) 특성으로 인해, 서버는 사용자의 상태를 저장할 필요가 없어서 확장성이 높아집니다.
- 단점: 한 번 발급된 JWT는 기본적으로 서버에서 조작할 수 없으므로, 보안 문제가 발생했을 때 취소하기 어렵습니다(단, 만료 시간을 짧게 설정하거나 블랙리스팅 같은 기법을 사용하여 완화할 수 있습니다).
JWT는 간단하고 확장 가능한 구조 덕분에 현대 웹 애플리케이션과 모바일 애플리케이션에서 널리 사용됩니다.