Web/기초
[Web] 1-1 JWT 이론
oss0202
2025. 12. 28. 20:29
JWT란 무엇인가?
- 서버가 클라이언트에게 "이 사용자는 누구다"라는 정보를 담아 서명해서 주는 토큰이다.
- 이후 요청마다 서버는 세션 저장 없이 토큰만 검증한다.(Stateless 인증 방식)
1. JWT를 왜 쓰는가?
1) 기존 세션 방식
Client -> 로그인
Server -> 세션 생성 + DB/메모리 저장
Client -> JESSIONID 쿠키 전송
Server -> 세션 조회
- 문제
- 서버 확장 시 세션 공유 필요
- Redis / Sticky Session 필요
- 모바일/API 기반 서비스에 불리
2. JWT 방식
Client -> 로그인
Server -> JWT 발급
Client -> Authorizaion 헤더에 JWT 포함
Server -> 서명 검증 -> 만료 확인
- 장점
- 서버가 상태를 안 가짐(Stateless)
- MSA / API 서버에 적합
- 확장성 좋은
- 단점
- 토큰 탈취 시 위험
- 강제 로그아웃 어려움
3. JWT 구조
JWT는 3부분으로 구성됨
Header.Payload.Signature
1) Header
- 어떤 알로리즘으로 서명했는지
{
"alg": "HS256",
"typ": "JWT"
}
2) Payload(Claims)
{
"sub": "oss0202",
"role": "ADMIN",
"iat": 170000000
"exp": 170003600
}
- Claim 종류
- Registerd : sub, iat, exp, iss
- Custom: userId, role
- 암호화 아님(Base64 인코딩) -> 민감정보 절대 금지
3) Signature
- 위변조 방지 핵심
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey
)
4. JWT 인증 흐름(실무 기준)
로그인
1. ID/PW 검증
2. JWT 생성
3. Client에 전달
API 요청
Authorization: Bearer {JWT}
서버처리
1. JWT 추출
2. 서명 검증
3. 만료(exp) 체크
4. Claim으로 사용자 인증
5. Access Token / Refresh Tokken
- 왜 나누는가?
- Access Token : 짧은 수명(10 ~ 30분)
- Refresh Token : 긴 수명( 2주 ~ 1달)
- 흐름
- 로그인 -> Access + Refresh 발급
- Access 만료 -> Refresh로 재발급
- Refresh 만료 -> 재로그인
- Refresh Token 저장위치
- JWT만으로 관리하면 위험하므로 DB or Redis에 저장하는것을 권장
6. JWT 보안 포인트(실부/면접 필수)
- ❌ 하면 안 되는 것
- Payload에 주민번호, 이메일, 전화번호
- Access Token을 LocalStorage에만 저장(XSS 취약)
- 무한 만료 토큰
- ✅ 권장
- Access Token : 메모리 or Secure Cookie
- Refresh Token : HttpOnly + Secure Cookie
- exp, iss, aud 체크
- 로그아웃 시 Refresh Token 폐기
7. JWT vs Session (면접 요약)
구분JWTSession
| 구분 | JWT | Session |
| 상태 | Stateless | Stateful |
| 확장성 | 좋음 | 불리 |
| 보안 | 토큰 탈취 리스크 | 세션 하이재킹 |
| 로그아웃 | 어려움 | 쉬움 |
| 모바일/API | 적합 | 부적합 |