📘JWT 토큰에 대해 알아보기
JWT 란? (JSON Web Token)
- 웹에서 사용자 인증과 정보 교환을 위해 사용하는 토큰 기반 인증 방법
- JSON 형식으로 데이터를 안전하게 전달하기 위해 만들어진 표준
- 서버와 클라이언트 간에 정보를 안전하게 주고받을 때 사용하며, 특히 인증 토큰으로 많이 활용된다.
JWT 구조
헤더(Header).페이로드(Payload).서명(Signature)
- 헤더(Header)
- 토큰 타입과 해시 알고리즘 정보를 담고 있다.
{ "alg": "HS256", "typ": "JWT" }
- 페이로드(Payload)
- 사용자 정보 및 토큰의 클레임(claim, 주장)을 담고 있다.
- 예: 사용자 ID, 권한, 토큰 만료 시간 등.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }
- 서명(Signature)
- 헤더와 페이로드를 비밀 키(secret key)로 암호화해 변조 방지를 위해 만든다.
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT 작동 방식
- Spring Security의 인증 아키텍처 흐름

1. HTTP Request가 들어오면 AuthenticationFilter에서 요청을 받음
2. 사용자가 제공한 인증 토큰(Username/Password)이 생성
3. AuthenticationManager로 토큰이 전달되어 인증 위임 시작
4. AuthenticationProvider 에게 실제 인증을 시도
5. Provider 에서 사용자 정보를 조회
6-7. UserDetailsService를 통해 실제 사용자 정보를 검색하고 검증
8-9. 인증 결과가 AuthenticationManager를 거쳐 Filter로 반환
10. 최종적으로 SecurityContextHolder에 인증 객체가 저장되어 인증 과정이 완료
JWT 장단점
장점
- 서버에 저장 X
- 토큰에 정보가 담겨 있어서 서버에서 세션을 관리할 필요 없음.
- 확장성 좋음
- 여러 서버(마이크로서비스)에서 인증 정보 공유 가능.
- 정보를 담을 수 있음
- 사용자 ID, 권한 등 필요한 정보를 토큰 안에 담아 쓸 수 있음.
- 보안 서명
단점
- 탈취되면 위험
- 토큰이 유출되면 만료되기 전까지 막을 수 없음.
- 중간에 삭제 어려움
- 강제 로그아웃 같은 처리가 어려움 (블랙리스트로 보완 가능).
- 암호화 아님
- 내용이 노출될 수 있어 민감한 정보는 넣으면 안 됨.
- 토큰이 길다
- 헤더에 포함되므로 데이터 크기가 커질 수 있음.
JWT 사용하려면
- 인증 상태를 서버에 저장하지 않고 클라이언트가 직접 가지고 다니게 하고 싶을 때
- 마이크로서비스 구조 등 분산 시스템 환경에서 인증 정보를 공유해야 할 때
- 모바일/웹 등 다양한 클라이언트에서 API 인증이 필요한 경우