[Spring Security] Form Login 개념

WOOK JONG KIM·2022년 11월 29일
0

패캠_java&Spring

목록 보기
73/103
post-thumbnail

Id/Password를 통한 인증


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

예시

http
                .headers().disable()
                .csrf().disable()
                .formLogin(login -> 
                        // true 로 하면 로그인 성공 시 무조건 메인 페이지로 되돌아감
                        login.defaultSuccessUrl("/", false)
                )
  • authenticationDetailSource : Authentication 객체details 에 들어갈 정보를 직접 만들어 줌

UsernamePasswordAuthenticationFilter 코드 일부

@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
        // 이를 통해 특정 IP 주소의 로그인을 막을수도 있음
		setDetails(request, authRequest);
		return this.getAuthenticationManager().authenticate(authRequest);
	}

Return 문을 보면 AuthenticationManager에게 인증을 위임하는데 이는 ProviderManager에게 인증을 처리할수 있는지 하나하나 물어 봄


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);
}

만약 로그아웃 요청이 들어오면 SecurityContextHolder에서 Authentication을 가져다가 Handler에게 넘겨 로그아웃을 처리하도록 함

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
profile
Journey for Backend Developer

0개의 댓글