이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
인증 API - Form 인증
Login
- 사용자가 '/home' URL 로 GET 방식을 사용해 자원에 접근한다.
- 인증된 사용자만이 접근 가능하다.
- 인증이 되어 있지 않다면 로그인 페이지로 리다이렉트 시킨다.
- username과 password를 입력한 뒤 POST 방식으로 접근을 시도한다.
- 이때 서버의 스프링 시큐리티가 SESSION을 생성한다.
- SESSION 인증 결과를 담은 인증 토큰을 생성하고 SESSION에 저장한다.
- 사용자는 다시 '/home' URL로 자원 접근을 시도한다.
- 스프링 시큐리티는 사용자의 세션으로부터 인증 토큰 여부를 확인한다.
인증 API - Form Login 인증
http.formLogin(); // Form 로그인 인증 기능이 작동한다.
- loginPage()
- 기본적으로 스프링 시큐리티에서 로그인 페이지를 제공한다.
- 직접 생성해 경로를 작성해도 된다.
- usernameParameter(), passwordParameter(), loginProcessingUrl() 메소드는 UI 화면에서 구성한 값과 동일하게 작성해주어야 한다.
문제점
- 현재 코드의 인가 정책을 살펴보면 어떠한 요청에도 인증을 받도록 되어있다.
- 이로인해 로그인 페이지도 인증을 요구한다.
- 로그인 페이지는 인증을 받지 않아도 접근 가능해야 한다.
- 이때 permitAll() 메소드를 사용한다.
실습
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
.anyRequest().authenticated()
)
.httpBasic(withDefaults());
http
.formLogin()
.loginPage("/loginPage") // 사용자 정의 로그인 페이지
.defaultSuccessUrl("/") // 로그인 성공 후 이동 페이지
.failureUrl("/login") // 로그인 실패 후 이동 페이지
.usernameParameter("userId") // 아이디 파라미터명 설정
.passwordParameter("passwd") // 패스워드 파라미터명 설정
.loginProcessingUrl("/login_proc") // 로그인 Form Action Url
.successHandler(new AuthenticationSuccessHandler() { // 로그인 성공 후 핸들러
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("authentication = " + authentication.getName());
response.sendRedirect("/");
}
})
.failureHandler(new AuthenticationFailureHandler() { // 로그인 실패 후 핸들러
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println("exception = " + exception.getMessage());
response.sendRedirect("/login");
}
})
.permitAll();
return http.build();
}
}
- 사용자 정의 로그인 페이지 URL을 '/loginPage'로 설정하였으므로 해당 URL에 대한 Controller를 생성해야 한다.
- permitAll() 메소드를 호출해 인증 없이도 누구나 로그인 페이지 접근이 가능하도록 한다.
@RestController
public class SecurityController {
@GetMapping("/")
public String index() {
return "home";
}
@GetMapping("/loginPage")
public String loginPage() {
return "loginPage";
}
}
결과 - loginPage()
- '/' URL로 접근하면 '/loginPage' URL로 이동되는 것을 확인할 수 있다.
결과 - successHandler()
- loginPage() 메소드 주석 처리 후
- 다음과 같이 successHandler와 failureHandler에 breakPoint를 설정하고 디버깅을 수행한다.
- 스프링 시큐리티에서 기본적으로 제공해주는 로그인 폼에서 로그인을 수행하면 successHandler() 메소드가 호출되고 authentication.getName()이 출력된다.
- 최종적으로 다음과 같이 '/' 페이지로 리다이렉트 된다.
결과 - failureHandler()
- 로그인 화면에서 잘못된 정보를 입력하면 다음과 같은 문구를 출력한다.
- 그리고 다시 로그인 페이지로 리다이렉트 한다.
결과 - usernameParameter(), passwordParameter()
'스프링 시큐리티 > 스프링 시큐리티 기본 API 및 Filter 이해' 카테고리의 다른 글
Logout 처리, LogoutFilter (1) | 2023.01.10 |
---|---|
FormLogin 인증 필터: UsernamePasswordAuthenticationFilter (0) | 2023.01.09 |
HTTP Basic 인증, BasicAuthenticationFilter (0) | 2023.01.09 |
사용자 정의 보안 기능 구현 (1) | 2023.01.09 |
프로젝트 구성 및 의존성 추가 (1) | 2023.01.09 |