Id/Password를 통한 인증
로그인시 나타나는 기본페이지를 처리해주는 필터
GET /login 을 처리
별도의 로그인 페이지 설정을 하지 않으면 제공되는 필터
기본 로그인 폼을 제공
OAuth2
/ OpenID
/ Saml2
로그인과도 같이 사용할 수 있음
POST /login 을 처리
. processingUrl 을 변경하면 주소를 바꿀 수 있음.
form 인증을 처리해주는 필터로 스프링 시큐리티에서 가장 일반적으로 쓰임
주요 설정 정보
로그인 성공시 처리 방법
로그인 실패시 처리 방법
예시
http
.headers().disable()
.csrf().disable()
.formLogin(login ->
// true 로 하면 로그인 성공 시 무조건 메인 페이지로 되돌아감
login.defaultSuccessUrl("/", false)
)
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
에게 인증을 처리할수 있는지 하나하나 물어 봄
GET /logout 을 처리
POST /logout 을 요청할 수 있는 UI 를 제공
DefaultLoginPageGeneratingFilter 를 사용하는 경우에 같이 제공됨.
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
LogoutSuccessHandler