[SPRING] CSRF - 처음 로그인 할 때만
SPRINGCSRF - 처음 로그인 할 때만
서버에 내 앱을 배포 할 때 처음으로 문제없이 로그인 할 수 있습니다. 하지만 로그 아웃 할 때 로그 아웃 요청에 "403 Forbidden"이 표시됩니다. 그런 다음 로그인 요청에서 403 오류가 발생하므로 성공적으로 로그인 할 수 없습니다. Ctrl + F5, 다시 로그인하려고하면 작동하지만 한 번만 작동합니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/apps", "/sites", "/users").authenticated()
.and()
.csrf()
.csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
및 CsrfHeaderFilter 클래스
public class CsrfHeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
response.setHeader("X-CSRF-HEADER", token.getHeaderName());
response.setHeader("X-CSRF-PARAM", token.getParameterName());
response.setHeader("X-XSRF-TOKEN", token.getToken());
if (token != null) {
Cookie cookie = WebUtils.getCookie(request, "X-XSRF-TOKEN");
if (cookie == null || token != null && !token.equals(cookie.getValue())) {
cookie = new Cookie("X-XSRF-TOKEN", token.getToken());
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
각도 :
$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';
중요한 경우 내 응용 프로그램은 localhost : 8080 / myApp에 배포됩니다.
해결법
-
==============================
1.로그인, 로그 아웃과 같은 특정 이벤트가 발생하면 CSRF 토큰이 변경됩니다. 따라서 다음 POST 요청은 귀하의 경우처럼 실패합니다. 나는 같은 문제에 직면했고, 어떤 진단을 한 후에 로그인, 로그 아웃 등의 다른 GET 요청을 보내는 것이 그 문제를 해결할 수있는 최선의 방법이 될 것임을 알았다. (CORS를 사용하지 않는 경우, 로그인이있을 수도 있고, 로그 아웃은 리다이렉트 응답을 보낼 수도 있습니다). 자세한 내용은이 stackoverflow 게시물을 참조하십시오.
로그인, 로그 아웃과 같은 특정 이벤트가 발생하면 CSRF 토큰이 변경됩니다. 따라서 다음 POST 요청은 귀하의 경우처럼 실패합니다. 나는 같은 문제에 직면했고, 어떤 진단을 한 후에 로그인, 로그 아웃 등의 다른 GET 요청을 보내는 것이 그 문제를 해결할 수있는 최선의 방법이 될 것임을 알았다. (CORS를 사용하지 않는 경우, 로그인이있을 수도 있고, 로그 아웃은 리다이렉트 응답을 보낼 수도 있습니다). 자세한 내용은이 stackoverflow 게시물을 참조하십시오.
from https://stackoverflow.com/questions/31947205/csrf-logs-in-only-the-first-time by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] RowMapper에서 쿼리 사용하기 (0) | 2019.05.24 |
---|---|
[SPRING] Grails : 특정 경로에서 Spring Security Core 비활성화 (0) | 2019.05.24 |
[SPRING] jOOQ는 소스를 생성하지 않습니다. (0) | 2019.05.24 |
[SPRING] 자바 Aspectj는 메소드에서 사용되는 리턴 값 (0) | 2019.05.24 |
[SPRING] Spring 보안에서 authentication-success-handler-ref와 동등한 커스텀 필터 사용법 (0) | 2019.05.24 |