[Security] Form Login 인증
인증 시나리오 순서
1. 인증이 안된 사용자가 특정 url로 접근
2. 서버에서는 인증이 안된유저로 판단될 경우 로그인 페이지로 리다이렉트 시킴
3. 사용자가 로그인 시도
4. 인증이 되었으면 세션을 생성하고 그 세션안에 인증토큰(Authentication 타입의 클래스 객체 , Security Context)을 생성 시킨후 저장함
5. 사용자는 다시한번 특정 url 접근시 세션안에 저장되어 있는 인증 토큰으로 리소스 에 접근하고 스프링 시큐리티는 세션에 저장된 인증토큰 을 보고 인증을 유지함
인증 API 에 대해 살펴보기
- Form Login 인증
http.formLogin() // form로그인 인증 기능이 작동함
.loginPage("/login.html") // 로그인 페이지 설정하기 (기본적으로는 시큐리티가 제공하는 로그인 페이지가 있지만 내가 직접 만들어서 사용할경우 !!! , 사실 필수 일듯)
.defaultSuccessUrl("/home") //로그인 성공시 이동할 페이지
.failureUrl("/login.html?error=true")//로그인 실패 시 이동할 페이지
.usernameParameter("userId")//로그인 페이지 html 안에 태그중 username에 해당하는 태그에 name 옵션을 바꾸고 싶을때 (로그인시 백단에서 받을 파라미터명이다. , default 값은 username)
.passwordParameter("passwd")//로그인 페이지 html 안에 태그중 password에 해당하는 태그에 name 옵션을 바꾸고 싶을때 (로그인시 백단에서 받을 파라미터명이다. , default 값은 password)
.loginProcessingUrl("/login") //로그인 페이지 html 안에 form 태그의 action 부분에 해당하는 것
.successHandler(loginSuccessHandler())//로그인 성공 후 핸드러로 조작 하고 싶을때
.failureHandler(loginSuccessHandler())// 로그인 실패 후 핸드러로 조작 하고 싶을때
한번 시나리오와 API를 이용하여 구현을 해볼것이다.
먼저 "configure 메소드 안에 http.formLogin() 메소드를 사용하여 Form 로그인 방식이 동작하도록 설정 하여야 한다
그 후 설정 메소드들을 모두 필요한 만큼 쓰면된다.
http.formLogin() //form 로그인방식 제공
.loginPage("/loginPage")
.defaultSuccessUrl("/")
.failureUrl("/login")
.usernameParameter("userId")
.passwordParameter("passwd")
.loginProcessingUrl("login_proc")
//원래는 AuthenticationSuccessHandler를 상속받은 커스텀 클래스를 만들어넣어야하는데 간단히 하기 위해 익명객체로 했음
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
//authentication 은 최종적으로 인증결과를 담은 객체임
System.out.println("authentication " + authentication.getName());
response.sendRedirect("/");
}
})
//원래는 AuthenticationFailureHandler를 상속받은 커스텀 클래스를 만들어넣어야하는데 간단히 하기 위해 익명객체로 했음
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException {
System.out.println("exception" + e.getMessage());
response.sendRedirect("/login");
}
})
.permitAll()//인가정책에서 모든 접근에 대해 인증을 받도록 했는데 로그인 페이지는 그러면 안되니깐 로그인 페이지만 인증없이 접근 가능하도록 설정함
설정한것에 결과를 몇개만 보면
usernameParameter , passwordParameter 설정으로 인해 사진과 같이 "name" 태그가 변경된 것을 확인 할 수있다.
로그인 성공시 동작하는 successHandler
로그인 실패시 동작하는 failureHandler