diff --git a/src/main/java/com/wb/domainserver/security/filter/JwtAuthenticationFilter.java b/src/main/java/com/wb/domainserver/security/filter/JwtAuthenticationFilter.java index 3c4072e6..69d84db3 100644 --- a/src/main/java/com/wb/domainserver/security/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/wb/domainserver/security/filter/JwtAuthenticationFilter.java @@ -56,8 +56,12 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { //사용자이면서 ACT가 없는데 tokenExpire는 있을 경우 //로그인된 사용자지만 엑세스 토큰이 만료되어 다시 재발급 받아야 하는 대상 - //expire값은 루프 요청 방지 - if(!StringUtils.hasText(accessToken) && StringUtils.hasText(tokenExpireCookie) && !"p".equals(expireChk)){ + //인증 진입점은 만료 쿠키가 남아 있어도 갱신 대상으로 보내지 않는다. + //쿠키 삭제가 지연되거나 이전 경로의 쿠키가 남아도 로그인 화면까지는 항상 도달해야 한다. + if(!isAuthenticationEndpoint(requestUri, realm) + && !StringUtils.hasText(accessToken) + && StringUtils.hasText(tokenExpireCookie) + && !"p".equals(expireChk)){ response.sendRedirect("/"+realm+"/tokens/refresh?redirect_uri=%s&expire=%s".formatted(URLEncoder.encode(UrlExtractor.getOriginalURL(request), StandardCharset.UTF_8), "p")); return; @@ -65,7 +69,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { // accessToken이 있고 refresh Token 요청이 아닌경우 - if (StringUtils.hasText(accessToken) && !requestUri.contains("/tokens/refresh")) { + if (StringUtils.hasText(accessToken) && !isAuthenticationEndpoint(requestUri, realm)) { UserDetails userDetails = customUserDetailService.loadUserByUsername(accessToken); if (userDetails != null) { log.debug("user details: {}", userDetails); @@ -91,6 +95,15 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { } + private boolean isAuthenticationEndpoint(String requestUri, String realm) { + String realmPath = "/" + realm; + + return requestUri.equals(realmPath) + || requestUri.startsWith(realmPath + "/login") + || requestUri.equals(realmPath + "/logout") + || requestUri.startsWith(realmPath + "/tokens/refresh"); + } + private String extractToken(HttpServletRequest request) {