2024.07.11
🔥오늘의 공부🔥
● 1. Security 인증에 대한 예외처리
● 2. AuthenticationFailureHandler ( 로그인 실패 예외 처리 )
● 3. AuthenticationEntryPoint ( 로그인 인증에 대한 리소스 접근 예외 처리 )
AuthenticationFailureHandler
Spring Security에서 인증에 실패 시 호출되어 처리할 작업을 정의하는 인터페이스입니다. 주로 로그인 시도가 실패한 경우에 호출이되며, 클라이언트에게 적절한 응답을 전송하는 등 여러가지 추가적인 작업을 수행 할 수 있다.
@Slf4j(topic = "FailureHandler[로그인 인증 실패 예외]")
@Component
public class FailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException
{
log.info("{}", "아이디 또는 비밀번호가 올바르지 않습니다.");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setCharacterEncoding("UTF-8");
response.getWriter().write("아이디 또는 비밀번호가 올바르지 않습니다.");
}
}
AuthenticationFailureHandler 인터페이스를 구현하는 클래스를 만들게 되면, 하나의 메서드를 오버라이딩할 수 있게 된다. 해당 클래스와 메서드는 로그인 실패했을 경우 수행이 되는 클래스와 메서드이다. ( 근데 직접 호출해야함... 불편쓰.. )
@Override
protected void unsuccessfulAuthentication(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException failed) throws ServletException, IOException {
failureHandler.onAuthenticationFailure(request, response, failed);
}
로그인이 실패할 시 호출되는 메서드이며, 의존성 주입을 통해 해당 메서드에서 호출하면서 예외를 넘길 수 있게 된다.
해당 AuthenticationException failed 에는 로그인 성공과 실패에 대한 예외 클래스가 정의되어있다.
AuthenticationEntryPoint
AuthenticationEntryPoint는 Spring Security에서 인증되지 않은 사용자가 보호된 리소스에 접근할 때 호출되는 인터페이스입니다. 주로 다음 두 가지 상황에서 사용됩니다
1. 로그인되지 않은 사용자의 접근 시
보호된 리소스에 접근하려고 할 때 인증되지 않은 상태인 경우, AuthenticationEntryPoint가 호출이 된다. 이때 일반적으로 로그인 페이지로 리다이렉틑하거나, 인증 실패에 대한 JSON응답을 반환하는 등의 작업을 수행할 수 있다.
2. 인증된 사용자가 권한 없는 리소스에 접근 시
사용자가 인증은 되어 있지만 해당 리소스에 대한 권한이 없는 경우에도 AuthenticationEntryPoint가 호출될 수 있다. 이 경우에도 접근이 거부되었다는 정보를 클라이언트에게 전달할 수 있다.
즉, AuthenticationEntryPoint는 인증되지 않은 접근을 처리하는 경우와 권한 없는 접근을 처리하는 경우 모두에 사용될 수 있다. 일반적으로는 로그인되지 않은 사용자의 경우에 더 많이 사용되며, 인증이 되었지만 권한이 없는 경우는 AccessDeniedHandler를 사용하는 것이 더 적절할 수 있습니다.
@Slf4j(topic = "CustomAuthenticationEntryPoint[리소스 접근에 대한 인증 예외 처리]")
@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
if(authException instanceof InsufficientAuthenticationException) {
log.info("{}", "[로그인 상태 : false] 리소스 접근에 대한 인증이 되어있지 않습니다.");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setCharacterEncoding("UTF-8");
response.getWriter().write("현재 로그인이 되어있지 않습니다.");
}
}
}
public class WebSecurityConfig {
private final AuthenticationEntryPoint authenticationEntryPoint;
http.exceptionHandling(
(handler) -> handler.authenticationEntryPoint(authenticationEntryPoint)
);
}
AutenticationEntryPoint 인터페이스를 구현하는 Custom클래스를 하나 정의를 해두고, 해당 클래스를 SecurityConfig 설정파일에 의존성 주입을 시켜주고, authenticationEntryPoint 객체를 주입 해주기만 하면 이용이 가능하다.
AccessDeniedHandler
로그인에 대한 인증은 되었지만 리소스에 대한 접근 권한이 없는 경우 발생하는 예외이다.
추가할 예정이다.
회고
AccessDeniedHanlder 또한 예외를 처리 할 예정이며, 추가할 예정이다!
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 62일차 TIL - JPA(CascadeType, OrphanRemoval) (0) | 2024.07.16 |
---|---|
내일배움캠프 61일차 TIL - 쿼리 최적화 (0) | 2024.07.13 |
내일배움캠프 59일차 TIL - 심화 프로젝트 설계 (0) | 2024.07.10 |
내일배움캠프 58일차 TIL - Redis (0) | 2024.07.09 |
내일배움캠프 57일차 TIL - Docker(1) (0) | 2024.07.08 |