JWT란?

야아니·2025년 12월 6일

Java 백엔드 교육

목록 보기
6/6

JWT(Json Web Token)

프로젝트를 진행하며 다루었던 JWT에 대한 복습 겸 정리를 해보려고 한다.


🧩 JWT란?

Json Web Token의 약자로, 사용자 인증/인가 정보를 JSON 형식으로 담아 클라이언트와 서버가 주고받는 서명된 토큰

주요 특징

  • Stateless: 서버가 세션을 저장하지 않아도 됨
  • 클라이언트가 매 요청마다 토큰을 보내서 인증
  • 토큰 변조를 서명(Signature)으로 방지

📦 JWT 구조 (3가지 파트)

JWT는 .으로 구분된 3개의 Base64Url 문자열로 구성

xxxxx.yyyyy.zzzzz
Header.Payload.Signature

1️⃣ Header (헤더)

{
  "alg": "HMAC SHA256",
  "typ": "JWT"
}
  • alg: 서명 알고리즘 (HMAC SHA256, RS256 등)
  • typ: 토큰 타입 (JWT)

→ 이 JSON을 Base64Url로 인코딩한 것이 헤더 부분이다.


2️⃣ Payload (페이로드)

토큰에 담긴 실제 데이터(클레임, Claims)

대표적인 클레임

  • sub: 사용자 식별자 (주체, Subject)
  • iat: 발급 시간 (Issued At)
  • exp: 만료 시간 (Expiration)
{
  "sub": "user123",
  "role": "USER",
  "exp": 1700000000
}

→ Header와 마찬가지로 Base64Url 인코딩

※ Payload는 암호화가 아니라 인코딩이므로
민감 정보(비밀번호 등)를 절대 넣지 않도록 한다.


3️⃣ Signature (서명)

토큰 위변조 방지를 위한 서명 부분입니다.

예시: HS256 알고리즘

HMACSHA256(
    Base64UrlEncode(header) + "." + Base64UrlEncode(payload),
    secret
)

서버는 이 Signature를 검증해 토큰이 조작되지 않았는지 확인함

💡 Secret Key 관리

서명에 사용되는 secret은 보안상 매우 중요하므로, 코드에 직접 작성하지 않고 application.properties 또는 application.yml 파일에서 관리


✅ JWT의 장점

  • 무상태(Stateless): 서버 확장 용이, 스케일 아웃 쉬움
  • HTTP Header에 실어서 보내기 편함
  • 서버 저장소 불필요 → 로드 밸런싱에 유리
  • MSA(마이크로서비스) 환경에 적합

❗ 단점 및 주의사항

단점해결 방안
토큰 탈취 시 만료까지 악용 가능RefreshToken 전략, 짧은 만료 시간 설정
Payload가 암호화되지 않음민감 정보 포함 금지
profile
세계평화를 원하는 사람입니다.

0개의 댓글