1. 커스텀 로그인 페이지
로그인페이지를 다시 제작해서 사용해야 한다. 이를 이용하는 방식은 접근 제한 페이지와 유사하게 직접 특정한 URI를 지정할 수 있다.
<security:form-login login-page="/customLogin"/>
login-page 속성의 URI는 반드시 GET 방식으로 접근하는 URI를 지정한다.
com.grindman.web.controller 패키지의 CommonController에 '/customLogin'에 해당하는 메소드를 추가하자.
@GetMapping("/customLogin")
public void loginInput(String error, String logout, Model model) {
System.out.println("error : " + error);
System.out.println("logout : " + logout);
if(error != null) {
model.addAttribute("error", "Login Error Check Your Account");
}
if(logout != null) {
model.addAttribute("logout", "Logout!");
}
}
loginInput()은 GET 방식으로 접근하고, 에러 메시지와 로그아웃 메시지를 파라미터로 사용할 수 있다.
view 폴더에는 customLogin.jsp를 추가하자.
customLogin.jsp 일부..
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
마지막의 <input type="hidden"> 태그는 조금 특이하게도 ${_csrf.parameterName } 으로 처리한다. 이 EL의 값은 실제 브라우저에서는 '_csrf'라는 이름으로 처리된다. (이 때의 value 값은 임의의 값이 지정된다.)
2. CSRF(Cross-site request forgery) 공격과 토큰
스프링 시큐리티에서 POST 방식을 이용하는 경우 기본적으로 CSRF 토큰이라는 것을 이용하게 된다. 별도의 설정이 없다면 스프링 시큐리티가 적용된 사이트의 모든 POST 방식에는 CSRF 토큰이 사용되는데 '사이트간 위조 방지'를 목적으로 특정한 값의 토큰을 사용하는 방식이다.
CSRF 공격을 막기 위해서는 여러 방식이 존재할 수 있따. CSRF 공격 자체가 사용자의 요청에 대한 출처를 검사하지 않아서 생기는 허점이기 때문에 사용자의 요청에 대한 출처를 의미하는 referer 헤더를 체크하거나 일반적인 경우에 잘 사용되지 않고 REST 방식에서 사용되는 PUT, DELETE와 같은 방식을 이용하는 등의 방식을 고려해 볼 수 있다.
3. CSRF 토큰
CSRF 토큰은 사용자가 임의로 변하는 특정한 토큰값을 서버에서 체크하는 방식이다. 서버에는 브라우저에 데이터를 전송할 때 CSRF 토큰을 같이 전송한다. 사용자가 POST 방식 등으로 특정한 작업을 할 때는 브라우저에서 전송된 CSRF 토큰의 값과 서버가 보관하고 있는 토큰의 값을 비교한다. 만일 CSRF
토큰의값이다르다면작업을 처리하지 않는 방식이다.
4. 스프링 시큐리티의 CSRF 설정
일반적으로 CSRF 토큰은 세션을 통해서 보관하고, 브라우저에서 전송된 CSRF 토큰값을검사하는방식으로처리한다.
스프링 시큐리티에서는 CSRF 토큰 생성을 비활성화하거나 CSRF 토큰을쿠키를이용해서처리하는등의설정을지원한다.
<security:csrf disabled="true"/>
'spring' 카테고리의 다른 글
| Class ContextLoader (0) | 2020.10.28 |
|---|---|
| Class RequestContextHolder (1) | 2020.10.23 |
| [스프링 시큐리티] 로그인과 로그아웃 처리(2) (0) | 2020.10.23 |
| [스프링 시큐리티] 로그인과 로그아웃 처리(1) (0) | 2020.10.23 |
| Interface HttpServletRequest (0) | 2020.10.23 |