JwtUtil 클래스
public Claims getCustomerClaim(String token) {
return Jwts.parserBuilder()
.setSigningKey(key).build()
.parseClaimsJws(token)
.getBody();
}
JwtAuthorizationFilter 클래스
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res,
FilterChain filterChain) throws ServletException, IOException {
String tokenValue = jwtUtil.getJwtFromHeader(req);
//헤더를 제거함
if (StringUtils.hasText(tokenValue)) {//토큰이 유효한지 확인
if (!jwtUtil.validateToken(tokenValue)) {
log.error("Token Error");
return;
}
Claims info = jwtUtil.getCustomerClaim(tokenValue);
//
try {
setAuthentication(info.getSubject());
} catch (Exception e) {
log.error(e.getMessage());
return;
}
}
filterChain.doFilter(req, res);
}
Spring Security에서 JWT 토큰을 이용한 인증을 처리하는 필터의 일부이다.
getCustomerClaim(String token) : 이 메소드는 주어진 JWT 토큰에서 Claims(즉, 토큰의 페이로드 부분)을 추출하는 역할을 한다.
doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) :
이 메소드는 HTTP 요청이 들어올 때마다 실행되는 필터의 핵심 로직이다. 필터는 요청과 응답을 가로채서 특정 작업을 수행하는 역할을 한다.
jwtUtil.validateToken(tokenValue): 가져온 토큰이 유효한지 검증한다. 만약 유효하지 않으면 에러를 로그에 기록하고 필터의 실행을 종료한다.
setAuthentication(info.getSubject()): setAuthentication 메소드는 SecurityContext에 인증 정보를 설정하는 역할을 한다. info.getSubject()는 토큰의 주체(일반적으로 사용자 ID)를 가져온다. 이 주체를 이용하여 인증 객체를 생성하고, 이를 SecurityContext에 설정하여, 이후의 인증/인가 과정에서 사용하게 된다.
필터(Filter)와 인터셉터(Interceptor)는 모두 클라이언트의 요청을 서버가 처리하기 전에 특정 작업을 수행하게 해주는 역할을 하지만, 그들의 동작 범위와 사용 목적에는 차이가 있다.
필터 :
인터셉터(Interceptor) : Spring의 DispatcherServlet이 컨트롤러를 호출하기 전후로 동작하며, AOP(Aspect Oriented Programming)와 비슷한 역할을 한다.
주로 로그인 체크, 권한 체크, 프로그램 실행 시간 계산 작업, 로그 기록 등에 사용된다.
Spring의 Bean에 접근이 가능하므로, Spring의 기능을 활용하여 처리할 수 있다.
필터는 웹 애플리케이션에 대한 전반적인 요청과 응답에 대한 처리를 담당하며, 인터셉터는 Spring의 DispatcherServlet이 컨트롤러로 요청을 보내기 전후의 처리를 담당한다.