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")
);
}
}
비정상적인 활동 감지
- 모니터링을 통해 악의적인 사용자의 토큰 확인되면 테이블에 행을 추가하여 사용을 중지할 수 있습니다.
'Spring > Spring Security' 카테고리의 다른 글
[Spring Security] 4-2. 보안: Security HTTP Response Headers (2) | 2023.10.14 |
---|---|
[Spring Security] 4-1. 보안: CSRF (0) | 2023.10.06 |
[Spring Security][KoLiving] 4-4. RefreshToken Rotation (0) | 2023.10.03 |
[Spring Security][KoLiving] 4-3. RefreshToken (2) | 2023.10.03 |
[Spring Security][KoLiving] 4-2. JwtProvider (2) | 2023.10.03 |