JWT(Json Web Token)는 JSON 포맷을 이용하여 사용자 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식입니다.
대용량 트래픽 처리를 위해 서버를 늘리면 문제가 발생합니다.
Server 1: Session1 → Client1, Client2, Client3
Server 2: Session2 → Client4
Server 3: Session3 → Client5, Client6
문제 상황: Client1이 Server2에 요청하면?
→ Server2의 Session2에는 Client1의 로그인 정보가 없어서 인증 실패
서버 부하 감소
도메인 간 인증 용이
구현 복잡도 증가
네트워크 비용 증가
토큰 만료 관리의 어려움
보안 위험
// 1. 클라이언트가 username, password로 로그인 성공
// 2. 서버에서 로그인 정보를 JWT로 암호화 (Secret Key 사용)
// JWT를 쿠키에 담아 응답
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, token); // Name-Value 형태
cookie.setPath("/"); // 모든 경로에서 쿠키 접근 가능
// Response 객체에 Cookie 추가
response.addCookie(cookie);
// 3. 브라우저 쿠키 저장소에 JWT 자동 저장
// 클라이언트가 API 요청 시 쿠키에서 JWT 추출
public String getTokenFromRequest(HttpServletRequest req) {
Cookie[] cookies = req.getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
// JWT가 담긴 쿠키 찾기
if (cookie.getName().equals(AUTHORIZATION_HEADER)) {
try {
// URL 인코딩된 값을 디코딩
return URLDecoder.decode(cookie.getValue(), "UTF-8");
} catch (UnsupportedEncodingException e) {
return null;
}
}
}
}
return null;
}
서버의 검증 과정:
1. JWT 위조 여부 검증 (Secret Key 사용)
2. JWT 유효기간 확인
3. 검증 성공 시 → JWT에서 사용자 정보 추출하여 사용
JWT는 Header / Payload / Signature 세 부분으로 구성됩니다.
{
"alg": "HS256", // 암호화 알고리즘
"typ": "JWT" // 토큰 타입
}
{
"sub": "1234567890", // Subject (주제)
"username": "Tom", // 사용자 정보
"admin": true // 권한 정보
}
실제 사용자 정보가 담기는 곳입니다.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret // Secret Key로 서명
)
Header와 Payload를 합쳐서 Secret Key로 서명한 값입니다.
유효기간 짧게 설정
민감한 정보는 Payload에 넣지 않기
HTTPS 사용 필수
Secret Key 관리 철저히
| 상황 | 추천 방식 |
|---|---|
| 서버 확장이 필요한 경우 | JWT |
| 외부 서비스와 인증 연동 | JWT |
| 즉시 로그아웃 필요 | Session |
| 작은 규모의 애플리케이션 | Session |
JWT는 서버의 부담을 줄이고 확장성을 높이는 현대적인 인증 방식입니다. 하지만 보안에 주의해야 하며, 특히 Secret Key 관리와 유효기간 설정이 중요합니다.
세션과 JWT의 장단점을 이해하고, 프로젝트 상황에 맞는 인증 방식을 선택하는 것이 중요합니다.
참고 자료