상세 컨텐츠

본문 제목

🌱👮🏿‍♀️Spring Security (2) - Login Form 인증, FormLoginFilter 동작 순서

SPRING/spring security

by 개발하는 정복자 2022. 5. 23. 19:33

본문

- 이전 챕터

🌱👮🏿‍♀️Spring Security (1) - 스프링 시큐리티 시작하기

- FormLoginFilter 동작 순서

 

  1. 요청이 오면 인증처리를 담당하는 UsernamePasswordAuthenticationFilter가 작동함
    • 이 클레스의 가장 큰 역할은 Username과 password를 저장하는 Authentication이라는 객체를 만들어 실질적으로 인증처리를 맞기는 역할을 한다.
  2. AntPathRequestMatcher("/login")
    • login으로 요청이 왔는지 확인
    • 아니면 다음 Filter로~
  3. Authentication(Username + Password)
    • 로그인할때 받은 아이디 비번을 Authentication 객체로 저장
  4. AuthenticationManager가 인증을 처리하는데 내부의 AuthenticationProvider에게 인증을 위임
    • 성공시
      • 인증 성공 return하고 Authentication(User + Authorities) 객체에 권한 정보인 Authorities를 추가적으로 담아 보내준다.
    • 실패시
      • AuthenticationException을 거쳐 1번 과정으로 돌아간다.
  5. 인증된 Authentication객체는 다시 SecurityContext(전역적으로 인증객체를 잠조할 수 있도록 함, 나중에 session에도 저장됨)객체에 저장
  6.  SuccessHandler 작동

 

- 코드로 보자!

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
                ;
        http
                .formLogin()	// formLogin 사용
                // .loginPage("/loginPage")  // security 에서 제공하는 from login 페이지 
                //  이외 개발자가 개별적으로 만든 페이지 매핑
                .defaultSuccessUrl("/") // 로그인 성공시 이동할 url
                .failureUrl("/login") // 로그인 실패시 이동할 url
                .usernameParameter("userid")    // user 필드명 재설정
                .passwordParameter("passwd")    // 비밀번호 필드명 재설정
                .loginProcessingUrl("/login_proc")   // from 태그의 action url 변경 | default : login
                .successHandler(new AuthenticationSuccessHandler() {	// 로그인 성공시 함수 호출
                // AuthenticationSuccessHandler 인터페이스를 구현한 것을 넣으면 된다
                    @Override
                    public void onAuthenticationSuccess(
                    		HttpServletRequest request,
                        	HttpServletResponse response,
                        	Authentication authentication
                        ) throws IOException, ServletException {
                        System.out.println("authentication : " + authentication.getName());    // 인증된 객체의 이름 보여주기
                        response.sendRedirect("/");     // redirect : url "/"
                    }
                })   
                .failureHandler(new AuthenticationFailureHandler() {	// 로그인 실패시 함수 호출
                // AuthenticationFailureHandler 인터페이스를 구현한 것을 넣으면 된다
                    @Override
                    public void onAuthenticationFailure(
                    		HttpServletRequest request,
                            HttpServletResponse response,
                            AuthenticationException exception
                    ) throws IOException, ServletException {
                        System.out.println("exception : " + exception.getMessage());   // 에러 메세지 출력
                        response.sendRedirect("/login");	// redirect : url "/login"
                    }
                })
                .permitAll()    // loginPage 의 접근을 인증없이 허용함
        ;
    }
}

 

 

관련글 더보기

댓글 영역