프로그래밍/Spring Security

[Spring Security] 스프링 시큐리티 폼 로그인

미냐님 2023. 4. 27. 14:42
728x90
반응형

옥탑방개발자 님의 강의를 보고 정리한 내용입니다


폼 로그인

DefaultLoginPageGeneratingFilter

  • GET /login 을 처리
  • 별도의 로그인 페이지 설정을 하지 않으면 제공되는 필터
  • 기본 로그인 폼을 제공
  • OAuth2 / OpenID / Saml2 로그인과도 같이 사용할 수 있음.

UsernamePasswordAuthenticationFilter

  • POST /login 을 처리. processingUrl 을 변경하면 주소를 바꿀 수 있음.
  • form 인증을 처리해주는 필터로 스프링 시큐리티에서 가장 일반적으로 쓰임.
  • 주요 설정 정보
    • filterProcessingUrl : 로그인을 처리해 줄 URL (POST)
    • username parameter : POST에 username에 대한 값을 넘겨줄 인자의 이름
    • password parameter : POST에 password에 대한 값을 넘겨줄 인자의 이름
    • 로그인 성공시 처리 방법
      • defaultSuccessUrl : alwaysUse 옵션 설정이 중요
      • successHandler
    • 로그인 실패시 처리 방법
      • failureUrl
      • failureHandler
    • authenticationDetailSource : Authentication 객체의 details 에 들어갈 정보를 직접 만들어 줌.
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException {
        if (this.postOnly && !request.getMethod().equals("POST")) {
            throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
        }
        String username = obtainUsername(request);
        username = (username != null) ? username : "";
        username = username.trim();
        String password = obtainPassword(request);
        password = (password != null) ? password : "";
        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
        // Allow subclasses to set the "details" property
        setDetails(request, authRequest);
        return this.getAuthenticationManager().authenticate(authRequest);
    }

DefaultLogoutPageGeneratingFilter

  • GET /logout 을 처리
  • POST /logout 을 요청할 수 있는 UI 를 제공
  • DefaultLoginPageGeneratingFilter 를 사용하는 경우에 같이 제공됨.

LogoutFilter

  • POST /logout 을 처리. processiongUrl 을 변경하면 바꿀 수 있음.
  • 로그 아웃을 처리
    • session, SecurityContext, csrf, 쿠키, remember-me 쿠키 등을 삭제처리 함.
    • (기본) 로그인 페이지로 redirect
    private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (requiresLogout(request, response)) {
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();
            if (this.logger.isDebugEnabled()) {
                this.logger.debug(LogMessage.format("Logging out [%s]", auth));
            }
            this.handler.logout(request, response, auth);
            this.logoutSuccessHandler.onLogoutSuccess(request, response, auth);
            return;
        }
        chain.doFilter(request, response);
    }
  • LogoutHandler
    • void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication);
    • SecurityContextLogoutHandler : 세션과 SecurityContext 를 clear 함.
    • CookieClearingLogoutHandler : clear 대상이 된 쿠키들을 삭제함.
    • CsrfLogoutHandler : csrfTokenRepository 에서 csrf 토큰을 clear 함.
    • HeaderWriterLogoutHandler
    • RememberMeServices : remember-me 쿠키를 삭제함.
    • LogoutSuccessEventPublishingLogoutHandler : 로그아웃이 성공하면 이벤트를 발행함.
  • LogoutSuccessHandler
    • void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
      throws IOException, ServletException;
    • SimpleUrlLogoutSuccessHandler
728x90