[Spring Security] Form Login 구현하기

2024. 1. 4. 01:59백엔드/Spring Boot

Spring Security에서 제공하는 인증 방식에는 Form Login과 HTTP Basic Authentication 두가지 방법이 있다. 

Form Login 은 웹 애플리케이션에서 사용자에게 제공되는 로그인 폼을 통해 사용자를 인증하는 방식이고 

HTTP Basic Authentication은 요청이 발생할 때마다 header에 인증 정보를 포함시켜 인증을 하는 방식이다.

이번 게시글에서는 Form Login 방식에 대하여 자세히 알아보려고 한다. 

 

# Form Login 인증 프로세스

  1. 클라이언트가 GET 방식으로 특정 페이지에 접근을 요청한다. 
  2. 서버에서는 인증을 받은 상태인지, 인증된 사용자인지 확인 후 인증이 되지 않은 상태면 로그인 페이지로 리다이렉트 시킨다.
  3. 클라이언트가 로그인 페이지에서 POST 방식으로 계정정보를 보내면서 인증 시도
  4. 서버에서는 해당 정보를 가지고 계정 정보를 검사 후 인증에 성공한 경우 Spring Security가 SESSION ID를 생성 및 세션에 인증 정보 저장
  5. 인증을 받은 클라이언트는 다시 특정 페이지에 접근을 요청, 유효한 토큰 정보인 경우 인증이 유지되어 정상적인 접근이 이루어짐

 

# Form Login API 기능에 대하여 알아보자

  • loginPage() : 커스텀으로 만들어둔 로그인 페이지  경로 
  • defaultSuccessUrl() : 로그인 성공 후 이동할 페이지 경로
  • failureUrl() : 로그인 실패 후 이동할 페이지 
  • loginProcessingUrl : 로그인 Form Action Url / default : login
  • usernameParameter(), passwordParameter : 로그인 폼의 username, password input name 값 
  • successHandler : 로그인 성공 핸들러 
  • failureHandler : 로그인 실패 핸들러 
  • permitAll() : 로그인 관련 페이지에 대해서는 인증을 요구하지 않음
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(
                (auth) -> auth.anyRequest().authenticated()
            )
            .formLogin(
                form -> form
                        // 커스텀 제작 로그인 페이지
                        // .loginPage("/loginPage")
                        // 로그인 성공 후 이동할 페이지
                        .defaultSuccessUrl("/")
                        // 로그인 실패 후 이동할 페이지
                        .failureUrl("/login") // 실패했을때 이동하는 페이지
                        // 로그인 Form Action Url, default: /login
                        .loginProcessingUrl("/login_proc")
                        // 로그인 form input name 값, Spring security에서 기본으로 제공하는 폼을 사용하는 경우 자동으로 적용되지만 따로 제작한 폼을 사용하는 경우 input name값과 해당 값을 맞춰주어야 함
                        .usernameParameter("userId")
                        .passwordParameter("passwd")
                        // 로그인 성공 핸들러
                        .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();
    }

}

 

 

 

 

 

 

 

 

 

 

Reference

인프런 '스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security' - 정수원

 

스프링 시큐리티 강의 - 인프런

초급에서 중.고급에 이르기까지 스프링 시큐리티의 기본 개념부터 API 사용법과 내부 아키텍처를 학습하게 되고 이를 바탕으로 실전 프로젝트를 완성해 나감으로써 스프링 시큐리티의 인증과

www.inflearn.com