Skip to content

스프링 시큐리티 JWT Redis를 적용한 로그인 기능 구현 개발지식편(2)

이은비 edited this page Oct 28, 2022 · 2 revisions

스프링 시큐리티 + JWT + Redis를 적용한 로그인 기능 구현 - 개발지식편(2)

AuthenticationEntryPoint

API를 개발하다 보면, /auth에 대해서는 여러 상황에 따라 처리되어야 할 단계가 존재한다.

예를 들면, 회원가입이 완료되기 이전에 전화번호 인증번호 전송/인증번호 검증 & 이메일 인증번호 전송/인증번호 검증 등이 있다. 이러한 단계에 따라 추가적인 스프링 시큐리티 작업을 설정할 수 있다.

image

AuthenticationEntryPoint 인터페이스 코드를 들여다 보면 위와 같이 정의되어 있다. 설명을 유의깊게 읽어 보면, "구현은 인증 프로세스를 시작하는 데 필요한 경우, ServletResponse의 헤더를 수정해야 한다." 라고 명시되어 있다.

JwtAuthenticationEntryPoint.class

@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {

  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response,
      AuthenticationException authException) throws IOException, ServletException {
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED); // (1)
  }
}

따라서 위와 같이 (1) 응답의 기본 메세지로 401 응답 코드를 전송하도록 설정했다. 이를 통해 인증에 있어 실패하거나 헤더에 Authorization을 보내지 않는 경우에 대한 처리를 했다.

다음은 403에 대한 권한 처리이다. 예를 들어, admin, 일반 유저가 있다고 해보자. admin은 모든 API에 대해 접근 가능하지만, 일반 유저는 접근 가능한 API가 제한되어 있다. 그래서 인증과는 별개로 권한에 대한 처리가 필요하다.

이는 AccessDeniedHandler 인터페이스를 구현한 클래스를 통해 처리가 가능하다.

JwtAccessDeniedHandler.class

@Component
public class JwtAccessDeniedHandler implements AccessDeniedHandler {

  @Override
  public void handle(HttpServletRequest request, HttpServletResponse response,
      AccessDeniedException accessDeniedException) throws IOException, ServletException {
    response.sendError(HttpServletResponse.SC_FORBIDDEN);
  }
}

앞서 인증과 마찬가지로 응답에 403 응답코드를 지정하면 된다.

https://sas-study.tistory.com/362