✅ JWT란?
**JWT(Json Web Token)**는 사용자의 인증 정보를 JSON 형태로 인코딩하여, 디지털 서명된 토큰을 생성하고 이를 통해 사용자 인증 상태를 유지하는 방식이다. 이 토큰은 주로 HTTP 요청의 Authorization 헤더에 담겨 서버로 전달되며, 서버는 해당 토큰을 검증해 사용자의 신원을 확인한다.
무엇보다 Stateless 방식이라는 점이 핵심이다. 서버가 세션을 저장하지 않기 때문에 서버 확장성이 뛰어나고, 인증 상태 유지를 위해 별도의 세션 저장소를 사용할 필요도 없다.
✅ JWT의 사용 목적: 인증(Authentication)과 인가(Authorization)
JWT는 두 가지 중요한 보안 기능을 담당한다.
- 인증(Authentication): 사용자가 로그인할 때 서버는 해당 사용자 정보를 기반으로 JWT를 발급한다. 이후 이 토큰은 클라이언트에서 저장하고, 모든 요청에 담아 서버로 전달한다.
- 인가(Authorization): JWT의 페이로드(Payload)에는 사용자의 권한 정보(예: ROLE_USER, ROLE_ADMIN)도 담을 수 있다. 이를 통해 특정 API 요청 시 사용자의 권한을 검증하고, 접근 허용 여부를 판단할 수 있다.
✅ JWT 구조
JWT는 아래와 같은 세 부분으로 구성되며, 마침표(.) 로 구분된다:
xxxxx.yyyyy.zzzzz
- Header (헤더)
- typ: 토큰의 타입 (보통 JWT)
- alg: 해싱 알고리즘 (예: HS256)
- Payload (내용)
- 사용자 정보, 권한 정보 등의 클레임(Claim)이 담긴다
- Base64로 인코딩되어 있지만 암호화되지 않음
- 민감 정보 저장은 금지!
- Signature (서명)
- Header + Payload + Secret Key를 해싱하여 생성
- 위조 방지를 위한 보안 요소
✅ Bearer Token 이란?
HTTP 요청 시 Authorization 헤더에 아래와 같이 JWT를 담아 보내게 된다:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
여기서 Bearer는 "소지자"라는 의미이며, 해당 토큰을 소지한 클라이언트가 유효한 인증 사용자임을 나타낸다. 즉, 누군가 이 토큰을 탈취하면 그 사람도 인증된 사용자로 간주되므로, 토큰 유출은 곧 보안 사고로 이어진다.
✅ Spring Boot에서 JWT 인증 구현 방식
Spring Security와 함께 JWT 인증 시스템을 구현하면 다음과 같은 구성 흐름이 일반적이다:
- 로그인 요청 처리
- /login 엔드포인트로 ID/PW 전송
- 인증 성공 시 JWT 생성 및 반환
- JWT 발급
- JwtProvider 클래스에서 사용자 정보 기반 JWT 생성
- JWT 요청 처리 필터 등록
- JwtAuthenticationFilter 클래스에서 매 요청마다 토큰 검증
- 토큰이 유효하면 SecurityContext에 인증 객체 등록
- 인가(Authorization) 처리
- FilterSecurityInterceptor를 통해 권한 확인
- 예: @PreAuthorize("hasRole('ADMIN')") 등
// JWT 인증 필터 예시
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String token = resolveToken(request);
if (token != null && jwtProvider.validateToken(token)) {
Authentication auth = jwtProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
private String resolveToken(HttpServletRequest request) {
String bearer = request.getHeader("Authorization");
return (bearer != null && bearer.startsWith("Bearer ")) ?
bearer.substring(7) : null;
}
}
✅ JWT 사용 시 유의사항
- 만료 시간 설정: 토큰은 일반적으로 만료 시간이 짧게 설정됨 (exp 클레임 사용)
- Refresh Token 별도 관리 필요: Access Token 만료 시 새로 발급 받기 위한 Refresh Token 시스템 필요
- HTTPS 필수: 민감한 토큰을 전송하므로 반드시 HTTPS 환경에서만 사용해야 함
- 토큰 탈취 방지: 로컬스토리지보다 HttpOnly 쿠키 저장 방식이 보안상 더 안전
'웹개발 > SpringBoot' 카테고리의 다른 글
| Email 인증 구현 JavaMailSender 오류 해결 (0) | 2025.05.29 |
|---|---|
| Spring WebFlux의 개념과 구조적 특징 (1) | 2025.05.29 |
| Security (0) | 2025.05.27 |
| Rest API (1) | 2025.05.26 |
| Response/Request &Validation (0) | 2025.05.25 |