Spring/Spring Security

[Spring Security][KoLiving] 4-5. BlackList Token

noahkim_ 2023. 10. 3. 22:57

BlacklistToken 시스템은 AccessToken의 보안 취약성을 보완하는 방법입니다.

AccessToken은 짧은 유효기간으로 설정되도록 설계되어 탈취되더라도 오랫동안 사용할 수 없습니다.

그러나 그 기간동안 악의적인 공격자로 인해 피해를 받는 것은 사실이며 짧은 기간내에도 큰 피해를 줄 수 있습니다.

이러한 위험으로부터 보호하기 위해 유효하지 않은 AccessToken를 무효화하기 위해 도입되었습니다.

 

1. 인증 시 검증 절차로 확인

@Slf4j
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtProvider jwtProvider;
    private final IJwtService jwtService;
    private final HttpUtils httpUtils;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, AuthenticationException, JwtException {
        String accessToken = httpUtils.resolveToken(request);
        jwtProvider.validateToken(accessToken);
        if (jwtService.isBlackList(accessToken)) {
            throw new BlackListTokenException(jwtService.extractEmail(accessToken));
        }
        
    // ...
    }
}
  • AccessToken의 유효성을 검증하는데 BlacklistToken 여부도 확인해야 합니다.
  • BlacklistToken일 경우, 보안 리소스를 접근할 수 없습니다.
  • 로그인 창으로 리다이렉트 합니다.

 

 

2. 블랙리스트 등록

로그아웃

  • 유저가 인증된 상태로 서비스를 사용하다 로그아웃을 할 수 있습니다.
  • 이러한 경우 서비스를 다시 사용할 경우 재로그인을 하여 인증 상태가 되는것이 정상적입니다.
  • 이때 로그아웃 당시에 사용한 AccesToken은 무효화 되어야 합니다.
    • 로그아웃한 상태에서의 AccesToken가 탈취되더라도 무효화되었으므로 서버의 보안위험을 줄일 수 있습니다.

 

@Component
@RequiredArgsConstructor
public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {

    private final AuthFacade authFacade;
    private final HttpUtils httpUtils;

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
        String accessToken = httpUtils.resolveToken(request);
        authFacade.addToBlackList(accessToken); // blacklisting accesstoken 

        SecurityContextHolder.clearContext();

        httpUtils.setResponseWithRedirect(
                response,
                ResponseDto.success("logout success", HttpServletResponse.SC_ACCEPTED),
                httpUtils.getCurrentVersionPath("home")
        );
    }
}

 

비정상적인 활동 감지

  • 모니터링을 통해 악의적인 사용자의 토큰 확인되면 테이블에 행을 추가하여 사용을 중지할 수 있습니다.