JWT(Json Web Token)
- JWT(Json Web Token) 는 인증과 인가를 위해 사용되는 클레임 기반의 토큰 포맷입니다.
- JSON 형식의 데이터를 Base64Url로 인코딩한 문자열로,
- 주로 사용자 인증 정보 및 권한 정보를 담아 서버와 클라이언트 간에 안전하게 전송하는 데 사용됩니다.
JWT 구조
<Header>.<Payload>.<Signature>
- Header
- 어떤 알고리즘으로 서명했는지, 어떤 타입의 토큰인지 명시
{
"alg": "HS256",
"typ": "JWT"
}
- Payload (Claim)
- 실제 전송할 데이터가 담깁니다.
- 표준 클레임 (iss, exp, sub, aud 등) + 커스텀 클레임 (userId, role 등)을 포함할 수 있습니다.
{
"sub": "user123",
"exp": 1718916480,
"role": "admin"
}
- Signature
- 헤더와 페이로드를 인코딩한 후, 비밀 키(Secret Key)와 함께 서명해 무결성을 검증
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT 사용 과정
- 사용자 로그인 → 인증 완료 → 서버가 JWT 발급
- 클라이언트는 JWT를 저장하고 요청 시마다 Authorization: Bearer <token> 헤더에 포함
- 서버는 JWT 검증 후 인가 수행 (예: 역할 확인)
JWT 사용 시 주의 사항
- JWT는 Base64로 인코딩되어 있으므로 누구나 디코딩 가능
→ 민감한 정보는 절대 포함하지 말 것
- 시크릿 키가 단순하거나 유출되면 서명 위조 가능
→ 복잡한 시크릿 키 사용, 환경 변수 등 안전한 공간에 보관
- HTTPS 미사용 시 JWT 탈취 가능
→ 반드시 HTTPS 통신 사용, 저장 위치는 HttpOnly 쿠키 사용 권장
- JWT 탈취 시 만료 전까지 무제한 사용 가능
→ Refresh Token 도입, 탈취 감지 및 재발급 정책 설계 필요
- 토큰 만료 시간이 너무 짧으면 사용자 불편 초래
→ 적절한 만료 시간 설정, 슬라이딩 세션 등 전략 검토
- 로그아웃, 토큰 무효화 처리 필요
→ 서버 저장소 기반 블랙리스트 또는 Refresh Token Rotation 전략 활용
- 'none' 알고리즘 공격에 취약할 수 있음
→ 검증된 JWT 라이브러리 사용, 'none' 알고리즘 명시적 차단
- 토큰 갱신 시 UX 저하 우려
→ 자동 갱신 또는 사용자 행위 기반 갱신 로직 고려