728x90
개요
JSP로 간단한 게시판을 만들어보고 있었는데 로그인 후 접근 가능한 url로 접근할 때 로그인 여부를 체크하고 로그인하지 않았다면 로그인 화면으로 리다이렉트 시켜주는 기능이 필요했다.
그래서 이번에 알고는 있었지만 구현해본 적은 없었던 스프링 인터셉터를 사용해서 로그인 체크를 구현해보았다.
인터셉터
Spring Interceptor는 스프링 MVC에서 HTTP 요청 처리의 전, 후, 중간에 특정 작업을 수행할 수 있도록 도와주는 기능이다.
주로 요청 전에 인증, 로깅, 권한 체크 등과 같은 공통 작업을 수행하는데 많이 사용된다.
주로 Servlet Filter(필터)와 많이 비교된다. 둘 다 웹의 공토 작업을 수행하지만,
인터셉터는 Spring MVC가 제공하기 때문에, 컨트롤러 호출 전, 후, 중간에 요청을 가로채거나 수정을 할 수 있다. 주로 컨트롤러와 관련된 작업에 많이 사용된다.
필터는 서블릿에서 제공하기 때문에 모든 서블릿 요청과 응답에 대해 스플이과 상관없이 모든 서블릿 기반 웹 애플리케이션에서 사용된다.
구현
HandlerInterceptor
인터셉터를 만들려면 HandlerInterceptor 인터페이스를 구현해야 한다.
@Component
public class CommonInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
if (!SessionsAdmin.isLoginAdmin(session)) {
response.sendRedirect("/am/manager/login");
return false;
}
return true;
}
}
위 코드에서는 preHandle 메서드만 작성했지만 이 외에도 몇가지 메서드가 더 있다.
- preHandle : 컨트롤러 메서드 실행 전에 호출된다. 요청을 가로채거나 요청의 유효성 검사를 하는 데 사용된다. 나는 요청이 이루어지기 전에 로그인 여부를 체크하는 것이 목적이었기 때문에 preHandle을 통해 접근한 유저의 세션에 로그인 정보가 있는지 체크를 해줬다. (나는 세션 방식으로 인증 정보를 관리했다.)
- postHandle : 컨트롤러 메서드 실행 후 뷰가 렌더링 되기 전에 호출된다. 모델 데이터를 변경하거나 추가 작업을 수행하는 데 많이 사용된다.
- afterCompletion : 뷰 렌더링 또는 응답 전송 후에 호출된다. 리소스 정리와 관련되 작업을 수행하는 데 많이 사용된다.
WebMvcConfigurerAdapter
인터셉터를 설정하려면 WebMvcConfigurer에서 InterceptorRegistry를 통해 등록해야 한다.
@Configuration
@RequiredArgsConstructor
public class WebMvcConfig extends WebMvcConfigurerAdapter {
private final CommonInterceptor commonInterceptor;
/**
* 로그인 인증 Interceptor 설정
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(commonInterceptor)
.addPathPatterns("/**/*")
.excludePathPatterns("/am/manager/login", "/am/manager/loginProc");
}
}
- addPathPatterns : 인터셉터를 적용할 url을 설정할 수 있다. 나는 일단 모든 url에 적용하도록 했다.
- excludePathPatterns : 인터셉터를 적용하고 싶지 않은 url을 설정할 수 있다. 로그인 페이지와 로그인 검증을 담당하는 url은 인터셉터 적용에서 제외시켰다.
728x90
'Spring' 카테고리의 다른 글
Spring Boot Test - Mockito로 Static 메소드 완벽 제어하기 (2) | 2024.11.01 |
---|---|
Spring - 회원 팔로우 기능 구현 (1) | 2023.06.08 |
Spring - Spring Boot 초기 데이터 설정 (data.sql) (0) | 2023.05.29 |
Spring - 통합 테스트에서 S3 Mock 객체로 S3 자원 아끼기 (2) | 2023.05.24 |
Spring - 좋은 단위 테스트를 만드는 방법(JUnit) (2) | 2023.04.22 |