JWT(JSON Web Token)란?
서버와 클라이언트 간에 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식
- 주로 로그인 후 사용자 인증 상태를 유지할 때, 세션(Session) 대신 사용
구조
점(.)으로 구분된 3부분으로 이루어져 있다.
xxxxx.yyyyy.zzzzz
Header.Payload.Signature
1. Header(헤더)
토큰 타입과 서명 알고리즘 정보를 담음
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload(페이로드)
실제 담고 싶은 데이터(claim) 저장
* 암호화 되지 않으므로, 비밀번호 등 민감 정보를 담으면 안된다.
{
"sub": "user123", // 주체(사용자)
"role": "ADMIN", // 데이터(직책)
"iat": 1690000000, // 발급시간
"exp": 1690003600 // 만료시간
}
3. Signature(서명)
Header와 Payload를 인코딩한 뒤, 서버만 아는 비밀키(secret key)와 함께 암호화(서명)해서 위변조를 방지
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
동작의 흐름
1. 사용자 로그인 (ID / PW 전송)
2. 로그인 성공시, 서버가 JWT 발급해서 클라이언트에 전달
3. 클라이언트는 이후 요청마다 JWT를 헤더에 담아 전송
4. 서버는 JWT를 매번 검증해서 토큰의 유효성과 위변조 여부 확인
(클라이언트에서 보낸 JWT의 signature와 서버에서 새로 만든 JWT의 signature를 비교)
5. 검증 통과 시 요청 처리
세션과 비교
| 구분 | 세션 | JWT |
| 저장 위치 | 서버 (세션 스토리지) | 클라이언트 (토큰 자체에 정보 포함) |
| 서버 부담 | 세션 저장소 필요 | 저장 불필요 (Stateless) |
| 확장성 | 서버 간 세션 공유가 필요해서 불리함 | 서버 확장에 유리 |
| 로그아웃 / 무효화 | 서버에서 즉시 삭제 가능 | 만료 전까지 무료화 어려움 |
* JWT의 가장 큰 장점은 서버 확장에 강력한 인증 방식이라는 것!
→ 세션을 대체하게 된 이유
Spring Boot에서 흔히 쓰는 패턴
- JwtTokenProvider : 토큰 생성/검증 유틸 클래스 (secret key, 만료시간 설정)
- JwtAuthenticationFilter : OncePerRequestFilter를 상속해서 매 요청마다 헤더의 토큰을 파싱하고 SecurityContext에 인증 정보 설정
- Access Token / Refresh Token 분리 : Access Token은 짧은 만료(예: 30분~1시간), Refresh Token은 길게(예: 2주) 두고, Access Token 만료 시 Refresh Token으로 재발급
'Spring > 관련 지식' 카테고리의 다른 글
| AOP(Aspect-Oriented Programming)의 개념과 구현 (0) | 2026.07.27 |
|---|---|
| 인터셉터(Interceptor)의 개념과 구현 (0) | 2026.07.25 |
| JPA에서 Enum 활용 방법 (ORDINAL vs STRING 등) (0) | 2026.07.21 |
| N+1 문제의 개념과 해결 방법 (0) | 2026.07.09 |
| IoC/DI, 스프링 컨테이너와 Bean의 개념 (0) | 2026.07.07 |