springframework/시작하자SpringSecurity

3.Form Login 인증

Jungsoomin :) 2020. 9. 19. 00:02

Form 인증의 과정은?

  1. 클라이언트가 자원접근 시도

  2. 서버의 자원접근 보안정책에 맞지않으면 로그인페이지로 리다이렉트 

  3. POST 방식으로 로그인 인증시도 

  4.  SpringSecurity세션 ID를 생성 , 인증결과를 담은 증(Athenciation) 객체를 생성, SecurityContext 객체를 생성하여 인증객체를 담고 SecurityContext 객체Session에 담아보낸다.

  5. 이후 접근에는 SpringSecuritySession에서 인증토큰 존재여부를 확인하여 자원접근을 결정


Form 인증 방식의 API들은 무엇인가요?

Form Login 인증 API

  1. http.formLogin() : Form 로그인 인증기능 작동


           formLogin()의 하위 API

  • loginPage(url)

    : 사용자 정의 로그인 페이지

  • defaultSuccessUrl(url) : 로그인 성공 후 이동 페이지

  • failureUrl(url) : 실패 후 이동 페이지

  • usernameParameter("username") : 폼 태그 안의 유저 네임에 해당하는 input 파라미터네임을 변경 default = username

  • passwordParameter("password") : 폼 태그 안의 유저 패스워드에 해당하는 password 파라미터네임을 변경 default = password

  • loginProcessingUrl(url) : 로그인 Form 태그의 Action 속성 url 지정  default = /login

  • successHandler(method()) : 로그인 성공 후 작동하는 핸들러(Controller) , AuthenticationSuccessHandler 인터페이스의 구현객체가 온다.

  •  failureHandler(method()) : 로그인 실패 후 작동하는 핸들러(Controller) , AuthenticationFailureHandler 인터페이스 구현객체가 온다.


배운코드

  • .permitAll() : 해당 api의 접근은 모두 허가한다.


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http//인가
                .authorizeRequests() //요청들에 대한
                .anyRequest().authenticated();//어느 요청이든. 인증을한다.
        http//인증
                .formLogin()//폼로그인 방식으로 인증작업을 하겠다.
                .loginPage("/loginPage")//로그인할 url
                .defaultSuccessUrl("/")//로그인 성공시 url
                .failureUrl("/loginPage")//로그인 실패시 url
                .usernameParameter("userId")// input[name='']
                .passwordParameter("passwd")// password[name='']
                .loginProcessingUrl("/login_proc")// form[action='']
                .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("/");
                    }
                })
                .failureHandler(new AuthenticationFailureHandler() {// 로그인 실패시 작동할 핸들러 AuthenticationFailureHandler 구현객체가 온다.
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                        System.out.println("exception "+exception.getMessage());// AuthenticationException 의 메세지 내용 전달
                        response.sendRedirect("/loginPage");
                    }
                })
                .permitAll();
        ;
    }
}