로그인 처리를 구현한 뒤에 고민하던 것이 있었다. 그것은 바로 로그인과 회원가입 페이지 접속을 막는 것이었다. 어떤 방식으로 할까 고민하다가 일단 컨트롤러에서 접속을 막는 처리를 하기로 했다.
컨트롤러에서 페이지 접속 막기
@GetMapping("/login")
public String login() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth instanceof OAuth2AuthenticationToken) {
return "redirect:/";
}
log.info("{}", auth.getClass());
return "/login";
}
로그인을 처리하는 컨트롤러에서 위와 같이 작성해 주었다. 인증 객체를 가져오는 부분은 매개변수로 스프링이 자동 주입해주는 것을 사용해도 된다. 다만 이 경우에는 AnonymousAuthenticationToken의 경우 자동 주입이 안 되는 것 같으니 주의해야 한다. auth의 타입이 무엇인지 확인해 보려고 로그를 출력해 봤는데 OAuth2AuthenticationToken이라고 나와서 auth가 해당 클래스 타입인지 확인해서 맞으면(이미 로그인되어 있는 상태이면) 메인 화면으로 이동하도록 했다.
이렇게 하면 원하던대로 처리는 잘 된다. 하지만 뭔가 컨트롤러에서 보안 관련 로직을 작성하려니 마음에 안 들어서 필터를 하나 만들어 적용하기로 했다. 그리고 여러 경로를 막으려면 따로 처리를 해줘야 하기도 했다.
필터로 페이지 접속 막기
public class AfterLoginFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth instanceof OAuth2AuthenticationToken) {
response.sendRedirect("/");
} else {
doFilter(request, response, filterChain);
}
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
return !request.getServletPath().equals("/login") && !request.getServletPath().equals("/signup");
}
}
AfterLoginFilter라는 필터를 하나 만들었다. OncePerRequestFilter를 상속받아서 doFilterInternal()을 오버라이드하여 내용을 작성했다. 내용은 컨트롤러에서 작성한 내용과 다르지 않다. 하지만 컨트롤러는 특정 매핑 경로만 작동하는 반면에 필터의 경우 모든 요청에 대해 작동할 여지가 있으므로 shouldNotFilter()를 오버라이드 해줌으로써 /login과 /signup 두 경로에 대해서만 필터가 작동하도록 했다.

다음으로 FilterChain 설정을 해주었다. 등록하는 순서는 딱히 상관없긴 했는데 어차피 걸러질거 인증 필터 앞에서 미리 걸러지게 하려고 Before로 등록했다.
이제 설정을 하니 잘 동작한다!
'공부 > Spring Security' 카테고리의 다른 글
| [Spring Security] OAuth2UserService enum을 이용해서 리팩토링하기 (0) | 2024.10.12 |
|---|---|
| [Spring Security] JWT Deprecated 해결하기 (0) | 2024.03.18 |
| [Spring Security] Filter 인증 구조에 대해서 깨달은 점 (0) | 2024.01.17 |
| [Spring Security] CSRF 설정하기 (0) | 2024.01.10 |
| [Spring Security] 원하는 Filter 만들어서 사용하기 (0) | 2024.01.09 |