JWT 토큰 입력
JWT 토큰 구조
JWT는 Header, Payload, Signature 세 부분으로 구성됩니다
JWT 디코더는 JSON Web Token을 디코딩하고 검증하여 토큰의 내용을 확인할 수 있는 도구입니다.
🔑 JWT 토큰 입력
• 입력창에 JWT 토큰을 붙여넣으세요
• JWT는 점(.)으로 구분된 3개의 부분으로 구성되어야 합니다
• "샘플" 버튼을 클릭하면 예시 토큰을 확인할 수 있습니다
• "디코딩" 버튼을 클릭하여 토큰을 분석합니다
📊 디코딩 결과 확인
• Header: 토큰의 타입과 서명 알고리즘 정보
• Payload: 사용자 정보, 권한, 만료 시간 등의 클레임(Claims)
• Signature: 토큰의 무결성을 검증하는 서명 값
• 각 섹션의 복사 버튼으로 내용을 클립보드에 복사할 수 있습니다
⏰ 만료 검증
• exp(만료 시간) 클레임이 있으면 자동으로 만료 여부를 표시합니다
• iat(발급 시간)과 exp(만료 시간)을 사람이 읽을 수 있는 형식으로 보여줍니다
• 만료된 토큰은 빨간색으로, 유효한 토큰은 초록색으로 표시됩니다
🔒 보안 주의사항
• 이 도구는 클라이언트 측에서 실행되며 서버로 데이터를 전송하지 않습니다
• 서명 검증은 비밀키가 필요하므로 서버에서만 가능합니다
• 중요한 프로덕션 토큰은 안전한 환경에서만 디코딩하세요
JWT(JSON Web Token)는 인증과 정보 교환을 위한 개방형 표준(RFC 7519)입니다.
📝 JWT의 3가지 구성 요소
1️⃣ Header (헤더)
토큰의 메타데이터를 포함합니다.
• typ: 토큰 타입 (일반적으로 "JWT")
• alg: 서명 알고리즘 (HS256, RS256 등)
예시:
{
"alg": "HS256",
"typ": "JWT"
}
2️⃣ Payload (페이로드)
실제 전달하려는 정보(클레임, Claims)를 포함합니다.
표준 클레임:
• iss (Issuer): 토큰 발급자
• sub (Subject): 토큰 제목 (사용자 ID 등)
• aud (Audience): 토큰 대상자
• exp (Expiration Time): 만료 시간 (Unix timestamp)
• nbf (Not Before): 활성화 시간
• iat (Issued At): 발급 시간
• jti (JWT ID): 토큰 고유 식별자
커스텀 클레임:
• name, email, role 등 필요한 정보를 자유롭게 추가 가능
• 민감한 정보는 포함하지 않는 것이 좋습니다 (암호화되지 않음)
예시:
{
"sub": "1234567890",
"name": "Hong Gildong",
"email": "[email protected]",
"role": "admin",
"iat": 1516239022,
"exp": 1516325422
}
3️⃣ Signature (서명)
토큰의 무결성을 검증하기 위한 서명입니다.
• Header와 Payload를 Base64Url로 인코딩
• 비밀키(Secret Key) 또는 개인키(Private Key)로 서명
• 토큰이 변조되지 않았음을 증명
서명 생성 과정:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
🔐 최종 형태
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkhvbmcgR2lsZG9uZyJ9.signature
[Header].[Payload].[Signature]
각 부분은 Base64Url로 인코딩되고 점(.)으로 연결됩니다.
💡 JWT 사용 시 보안 가이드
1. 민감한 정보 저장 금지 ⚠️
JWT의 Payload는 Base64로 인코딩되어 있을 뿐 암호화되지 않습니다.
• 비밀번호, 카드번호, 주민등록번호 등을 JWT에 포함하지 마세요
• 누구나 디코딩하여 내용을 볼 수 있습니다
• 필요한 최소한의 정보만 포함하세요
2. 강력한 비밀키 사용 🔐
HS256 알고리즘 사용 시:
• 최소 256비트(32바이트) 이상의 랜덤한 비밀키 사용
• 예측 가능한 키(예: "secret", "password123")는 절대 금지
• 정기적으로 키를 교체하세요
RS256 알고리즘 사용 시:
• 최소 2048비트 RSA 키 사용
• 개인키는 절대 노출되지 않도록 관리
• 공개키만 클라이언트와 공유
3. 만료 시간 설정 필수 ⏰
• 모든 JWT에 exp(만료 시간) 클레임을 포함하세요
• 적절한 만료 시간 설정:
- Access Token: 15분 ~ 1시간
- Refresh Token: 1주일 ~ 1개월
• 만료된 토큰은 반드시 거부하세요
4. HTTPS 사용 필수 🔒
• JWT는 반드시 HTTPS를 통해서만 전송하세요
• HTTP로 전송하면 토큰이 탈취될 수 있습니다
• API 엔드포인트는 모두 HTTPS로 보호하세요
5. 저장소 선택 신중히 📦
브라우저에서 JWT 저장 시:
• localStorage: XSS 공격에 취약 (비권장)
• sessionStorage: XSS 공격에 취약 (비권장)
• httpOnly Cookie: XSS 공격 방지, CSRF 대책 필요 (권장)
• 메모리: 가장 안전하지만 새로고침 시 유실
6. 서명 알고리즘 검증 🔍
• alg: none 공격 방지를 위해 알고리즘 검증 필수
• 지원하는 알고리즘 화이트리스트 관리
• 예상치 못한 알고리즘은 거부
7. 토큰 무효화 전략 🚫
JWT는 Stateless하지만, 다음 경우 무효화가 필요합니다:
• 사용자 로그아웃
• 권한 변경
• 보안 침해 의심
무효화 방법:
• Refresh Token Rotation 사용
• 블랙리스트(Redis 등) 관리
• 짧은 만료 시간 + Refresh Token 사용
8. 클레임 검증 철저히 ✅
서버에서 다음을 반드시 검증하세요:
• 서명 (Signature) 유효성
• 만료 시간 (exp)
• 발급자 (iss)
• 대상자 (aud)
• 활성화 시간 (nbf)
9. 프로덕션 토큰 디버깅 주의 🔧
• 프로덕션 환경의 실제 토큰은 공개 도구에 붙여넣지 마세요
• 개발/테스트 환경에서만 샘플 토큰 사용
• 로그에 토큰을 기록하지 마세요
10. Refresh Token 사용 권장 🔄
• Access Token은 짧게(15분), Refresh Token은 길게(2주)
• Refresh Token으로 새로운 Access Token 발급
• Refresh Token은 서버에서 관리 및 무효화 가능
• Refresh Token Rotation으로 보안 강화