1.jwt서비스에 토큰 오픈 코드 작성
public String getValue(String jwtToken){
try {
// JWT 검증을 위한 알고리즘 설정
Algorithm algorithm = Algorithm.HMAC512(jwtSecret);
// JWT 검증기 생성
JWTVerifier verifier = JWT.require(algorithm).build();
return verifier.verify(jwtToken).getSubject();
} catch (Exception e) {
// 토큰이 유효하지 않거나 디코딩에 실패한 경우
e.printStackTrace();
log.error("토큰이 유요하지 않습니다");
return null;
}
}
2.인증필터 작성
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("인증필터 입장");
// 현재 요청된 URL 확인
String requestURI = request.getRequestURI();
log.info("Request URI: {}", requestURI);
// 허용되는 URL 패턴 정의
String allowedPattern = "/pass"; // 예시로 "/public/"로 시작하는 URL은 인증 필터를 통과시킴
// 허용되는 URL 패턴인 경우 통과
if (requestURI.startsWith(allowedPattern)) {
log.info("허용되는 URL, 필터 통과");
chain.doFilter(request, response);
return;
}
log.info("허용되는 되지않는 URL, 검증시작");
// 쿠키에서 엑세스 토큰 추출
String accessToken = extractAccessTokenFromCookie(request);
log.info("accessToken:{}",accessToken);
if (accessToken != null) {
// 엑세스 토큰에서 사용자 ID 추출
String username = tokenService.getValue(accessToken);
log.info("username:{}",username);
// 시큐리티 세션에 인증 주입
PrincipalDetails principalDetails =new PrincipalDetails(username,null);
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities()));
if(username==null){
set403(response);
}
chain.doFilter(request, response);
return;
}
log.info("accessToken을 찾을 수없습니다");
set403(response);
}
테스트
404/404/403 정상
코드
https://github.com/novb1492/login/tree/auth-filter