JWT(JSON Web Token)는 JSON 기반의 데이터를 암호화하여 토큰 형식으로 전달하는 방식입니다.
주로 사용자 인증과 정보 교환을 위해 사용되며 Stateless 환경에서 세션을 대체할 수 있는 방식으로 활용됩니다.
JWT는 다음과 같은 구조로 구성:
1. Header: 토큰의 타입과 알고리즘 정보
2. Payload: 인증 정보나 데이터를 포함
3. Signature: 토큰의 유효성을 확인하기 위한 서명
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header
{
"alg": "HS256",
"typ": "JWT"
}
Payload
iss(발급자), exp(만료 시간) 등등 {
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
Self-contained
Stateless
Base64 인코딩
서명(Signature)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtProvider {
private final String secretKey = "mySecretKey";
private final long validityInMilliseconds = 3600000; // 1시간
public String createToken(String username) {
return Jwts.builder()
.setSubject(username) // 사용자 정보
.setIssuedAt(new Date()) // 발급 시간
.setExpiration(new Date(System.currentTimeMillis() + validityInMilliseconds)) // 만료 시간
.signWith(SignatureAlgorithm.HS256, secretKey) // 서명
.compact();
}
}
public boolean validateToken(String token) {
try {
Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
사용자 인증
정보 교환
API 인증
JWT는 서버 확장성과 편의성을 높이는 데 매우 유용한 인증 방식입니다. Spring Security에서 JWT를 구현하며 인증 프로세스를 효율적으로 처리하는 경험을 할 수 있었습니다.
하지만 JWT는 민감한 정보를 직접 포함하면 안 되며 만료 처리와 비밀 키 관리를 철저히 해야 한다는 점을 배웠습니다.
프로젝트 상황에 따라 JWT를 세션과 혼합하거나 OAuth2와 연계하는 등 다양한 인증 전략을 설계하는 것이 중요하다는 것을 느꼈습니다.