1. JWT 기술 개요
JWT는 Json Web Token의 약자로, JSON 형식의 데이터를 서명(Signature) 해서 안전하게 전송하기 위한 인증·인가 방식입니다.
토큰 기반 인증 시스템에서 많이 쓰이며, 서버와 클라이언트 간에 사용자 상태를 유지할 필요 없이 인증 정보를 전달할 수 있습니다.
---
JWT 구조
JWT는 Header.Payload.Signature 3부분으로 구성됩니다.
1. Header (헤더)
토큰의 타입(JWT)과 서명에 사용할 알고리즘(예: HS256)을 지정
{ "alg": "HS256", "typ": "JWT" }
2. Payload (페이로드)
실제 전달하고자 하는 데이터(클레임, Claim)
예: 사용자 ID, 권한, 토큰 만료 시간
{ "sub": "user123", "role": "ADMIN", "exp": 1723190400 }
3. Signature (서명)
Header와 Payload를 base64로 인코딩한 뒤, 비밀키로 서명하여 위변조 방지
예: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
---
동작 흐름
1. 사용자가 로그인 시 ID/PW로 서버에 요청
2. 서버는 인증 성공 시 JWT를 생성하여 클라이언트에 반환
3. 클라이언트는 JWT를 HTTP 헤더(Authorization: Bearer 토큰) 에 실어 요청
4. 서버는 토큰 서명을 검증 후, payload의 유저 정보를 사용해 API를 처리
5. 토큰이 만료되면 재발급(Refresh Token 방식) 또는 재로그인 요구
---
2. JWT 장점
무상태(Stateless): 세션 저장 불필요, 서버 확장 용이
빠른 검증: DB 조회 없이 서명만으로 유효성 검증 가능
다언어 호환성: JSON 기반이라 다양한 언어에서 사용 가능
---
3. 단점 & 주의점
토큰 크기가 커질 수 있어, 헤더 전송 시 네트워크 부하 증가 가능
발급 후 서버에서 강제 무효화 어렵다(보통 블랙리스트나 Redis 사용)
HTTPS 필수(토큰이 평문으로 노출되면 위험)
---
4. 제가 적용한 방식 (예시)
> 스프링 부트 + Spring Security + JWT
1. 로그인 API
사용자가 /login으로 ID/PW 제출
인증 성공 시 Access Token(15분)과 Refresh Token(7일) 생성
Refresh Token은 Redis에 저장해 재발급 시 검증 가능하도록 함
2. 토큰 발급 코드 예시
String jwt = Jwts.builder()
.setSubject(user.getUsername())
.claim("role", user.getRole())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 15)) // 15분
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
3. 요청 처리 시
OncePerRequestFilter에서 Authorization 헤더의 Bearer 토큰 추출
Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)로 검증
검증 통과 시 SecurityContext에 인증 정보 저장
4. 토큰 재발급
Access Token 만료 시 Refresh Token 검증 후 새 Access Token 발급
Refresh Token도 만료되면 재로그인
'Spring & Backend' 카테고리의 다른 글
| 트랜잭션과 데이터 일관성 (8) | 2025.08.11 |
|---|---|
| Canary 배포(Canary Deployment) (2) | 2025.08.10 |
| GC 로그 (Garbage Collection Log)와 힙덤프 (8) | 2025.08.08 |
| Storybook을 알고 계신가요? Storybook이란 무엇인지 설명해주세요. (4) | 2025.08.08 |
| Gradle에 대해 설명해 주세요 (4) | 2025.08.08 |
