[Spring] Spring security - custom login page
<form> 태그를 보면
action이 /login을 통해서 이루어 지며, Post 방식으로 데이터를 전달해야 합니다 또한
input 태그의 name 속성은기본적으로 username, password 속성을 사용합니다.
또한 마지막으로 hidden에서
${_csrf.parameterName}, ${_csrf.token} 을 확인할 수 있는데 페이지 속성보기를 통해 보면
아래와 같이 나타나는것을 확인 할 수 있습니다.
위에서 작한성 action이나 form 태그의 속성들은 기본 값으로 변경할 수 있습니다..
security-context.xml을 통해서
===============================================================================
CSRF(Cross-site request forgery) 공격과 토큰
- 스프링 시큐리티에서 POST 방식을 이용하는 경우 기본적으로 CSRF 토큰을 이용하게 된다.
- 스프링 시큐리티가 적용된 사이트의 모든 POST 방식에는 CSRF 토큰이 사용되는데 '사이트간 위조 방지'목적으로 특정한 값을 토큰을 사용하는 방식이다.
- CSRF토큰은 사용자가 임의로 변하는 특정한 토큰 값을 서버에서 체크하는 방식이다.
- 서버에는 브라우저에 데이터를 전송할 때 CSRF 토큰을 같이 전송합니다.
- 사용자가 POST방식 등으로 특정한 작업을 할 떄는 브라우저에서 전송된 CSRF 토큰의 값과 서버가 보관하고 있는 토큰의 값을 비교합니다. 그리고 CSRF 토큰 값이 다르면 작업을 처리하지 않는 방식입니다.
Spring Security의 CSRF 설정
- 일반적으로 CSRF 토큰은 세션을 통해 보관하고, 브라우저에서 전송된 CSRF 토큰값을 검사하는 방식으로 처리한다.
- 스프링 시큐리티에는 CSRF 토큰 생성을 비활성화 하거나 CSRF 토큰을 구키를 이용해서 처리하는 등의 설정을 지원함
=================================================================================
로그인 성공과 AuthenticationSuccessHandler
- 로그인 성공 이후에 특정한 동작을 제어하고 싶을경우 AuthenticationSuccessHandler라는 인터페이스를 구현해서 설정 할 수 있습니다.
security-context.xml 추가
로그인한 id, password에 따라서 이동하는 페이지가 다르다
로그인시 흐름을 보면
1. 최초 /board/write 를 통해 접속 시도
1.1. filter에 의하여 security:form-login login-page를 통하여 /customLogin으로 이동
2. CommonController 에 있는 /customLogin 으로 이동
2.1. 로그인 성공시
>> 로그인 성공시에는 authentication-success-handler-ref 를 통해서 customLoginSuccess객체를 통하여 추가 처리가 된다.
>> 현재는 admin으로 로그인이 성공되었으므로 /board/admin으로 이동하게 된다.
>> GET 호출에 의하여 아래의 코드가 호출되고 종료된다.
2.2. 로그인 실패시
>> 아래의 코드에 따라서 customLogin.jsp에 Model을 통해서 msg가 전달된다.
=================================================================================
로그아웃 처리와 LogoutSuccessHandler
- 로그인과 마찬가지로 특정한 URI를 지정하고, 로그아웃 처리 후 직접 로직을 처리할 수 있는 핸들러를 등록할 수 있다.
- invalidate-session 옵션을 통해서 세션값을 삭제할수 있는 옵션을 넣어주었다.
- logout-success-url 을 통해 로그아웃 성공시 이동할 페이지를 설정해줄수 있고
- success-handler-ref 를 통해 로그아웃 성공시 다른 작업을 추가적으로 해줄경우 사용하면된다.
- logout-success-url // success-handler-ref 를 사용하지 않을경우 기본 화면은 login 페이지로 돌아오게 된다.
logoutSuccessHandler를 사용할경우