JWT - Header, Payload, Signature
JWT(JSON Web Token)는 사용자 인증과 권한 부여를 위한 대표적인 토큰 기반 방식입니다. 많은 개발자들이 JWT를 사용하면서도 "헤더, 페이로드, 서명이 각각 무슨 역할을 하는지"는 모호하게 아는 경우가 많습니다.
이 글에서는 JWT를 구성하는 세 요소인 Header, Payload, Signature를 하나씩 뜯어보며, 구조, 역할, 보안상의 유의점까지 완벽하게 이해할 수 있도록 설명합니다.
1. JWT의 전체 구조
JWT는 .으로 구분된 세 개의 문자열로 구성됩니다.
<Header>.<Payload>.<Signature>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. ← Header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNTE2MjM5MDIyfQ. ← Payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ← Signature
- 각 부분을 자세히 살펴봅시다.
a. Header (토큰의 타입과 서명 알고리즘)
{
"alg": "HS256",
"typ": "JWT"
}
역할
- alg : 서명(Signature)을 생성하는 데 사용되는 알고리즘 (예: HS256 (HMAC + SHA-256), RS256 (RSA + SHA-256))
- typ : 토큰의 타입 (대부분 "JWT")
보안 팁
- 알고리즘을 클라이언트가 조작할 수 있으므로, 서버에서 알고리즘을 고정해서 검증해야 합니다.
b. Payload (토큰의 실제 데이터)
{
"sub": "1234567890",
"name": "Alice",
"role": "admin",
"iat": 1516239022,
"exp": 1713000000
}
역할
- 클레임(Claim)이라 부르는 데이터를 포함하며, 인증 및 권한 정보 등을 담음
- 크게 세 종류의 클레임이 있음
클레임 종류 | 설명 | 예시 |
등록된(Registered) | JWT 표준에 정의된 필드 | iss, exp, sub, iat, aud |
공개(Public) | 모든 사용자에게 공유 가능한 데이터 | name, role, email 등 |
비공개(Private) | 발급자와 수신자 간의 커스텀 필드 | 예: userId, isPremiumUser 등 |
주의 사항
- Base64Url 인코딩일 뿐, 암호화된 것이 아닙니다.
- 누구나 디코딩해서 내용을 볼 수 있으므로, 민감 정보(PIN, 패스워드 등)는 절대 포함하면 안됩니다.
- exp (만료 시간) 클레임은 필수로 설정하는 것이 좋습니다.
c. Signature (토큰 위조 방지)
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
- 또는 RSA를 사용할 경우, 개인 키로 서명하고 공개 키로 검증합니다.
역할
- 토큰이 위조되지 않았음을 보장
- 서버는 이 서명을 검증해 토큰이 신뢰할 수 있는 발급자에 의해 만들어졌는지 확인
예시 (Node.js)
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ name: 'Alice', role: 'admin' },
'my-secret-key', // 서명에 사용되는 비밀키
{ algorithm: 'HS256', expiresIn: '1h' }
);
- 이 서명 덕분에, Payload가 변경되면 서명이 무효화되어 검증에 실패하게 됩니다.
2. 시각화 - JWT 구조 한눈에 보기
┌────────────┐ ┌───────────────┐ ┌────────────────────┐
│ Header │ . │ Payload │ . │ Signature │
└────────────┘ └───────────────┘ └────────────────────┘
alg, typ 사용자 정보, 클레임 위조 방지 서명
3. 마무리
요약
구성 요소 | 역할 | 포함 정보 | 보안 주의 |
Header | 알고리즘, 타입 | alg, typ | 알고리즘 고정 필요 |
Payload | 사용자 데이터 | sub, name, role 등 | 민감 정보 금지 |
Signature | 위조 방지 | 서명값 | secret 키 철저히 보관 |
함께 보면 좋은 자료
블로그 글 :
[JWT] 인증 시스템의 핵심
JWT (JSON Web Token) 웹 애플리케이션에서 로그인 후 사용자 인증 상태를 어떻게 유지할까요? 세션? 쿠키? 이 외에도 현대적인 방식으로 널리 사용되는 것이 바로 JWT(JSON Web Token)입니다.이 글에서는 J
dachaes-devlogs.tistory.com
'시스템 지식 > 보안' 카테고리의 다른 글
[세션 하이재킹] 사용자의 신뢰를 가로채는 공격 (0) | 2025.04.21 |
---|---|
[Access Token과 Refresh Token] 개발자를 위한 인증 토큰 설명서 (0) | 2025.04.14 |
[JWT] 인증 시스템의 핵심 (0) | 2025.04.14 |
[OpenID Connect] OAuth로는 부족했던 인증을 해결하다. (0) | 2025.04.13 |
[OAuth] OAuth는 인증 기술이 아니다? (0) | 2025.04.12 |