지금 당장 세션 당 csrf 토큰이 있습니다. 그리고 숨겨진 필드를 사용하여이 토큰 JSP를 추가합니다. CSRF : 요청마다 토큰 생성
token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_NAME);
if (null==token) {
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
}
모든 요청에 대해
, 여기//calls the above snippet and this time token will not be null
String st = CSRFTokenManager.getTokenForSession(request.getSession());
String rt = CSRFTokenManager.getTokenFromRequest(request);
는, using이이 문자열 true 또는 false를 반환 하나를 비교할 같습니다 : 다음 코드는 세션 당 하나를 제공합니다.
제 질문은 세션에서 토큰을받지 않고 요청마다 토큰을 생성하려고하면 어떻게됩니까? 비교하는 동안, 나는 세션과 요청에서 얻을 것이다. 이 좋은 생각이거나 뭔가 빠졌습니까?
대신 위의 조각을 사용하여, 나는
//for every request generate a new and set in session
token = UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_NAME, token);
//get the token from session and request and compare
String st = (String) request.getSession().getAttribute("CSRF_TOKEN_FOR_SESSION_NAME");
String rt = CSRFTokenManager.getTokenFromRequest(request);
토큰을 생성하고 세션에 저장하지 않을 수 있습니다. 그것을 폼에 숨겨진 필드로 추가하고 쿠키로 추가하십시오. 요청을 받으면 필드와 쿠키의 값을 비교하십시오. –
확실하지는 않지만 쿠키는 CSRF 공격에 취약합니다. –
@ user1609085 CSRF 토큰의 아이디어는 공격자가 다른 사용자 A를 가장 한 "숨겨진"요청을 보내려고한다는 것입니다. 공격자는 다른 웹 사이트를 사용하여 주입 할 수 있습니다 일부 악의적 인 자바 스크립트 코드는이 사이트에서 쿠키 또는 특수 헤더 (브라우저가 공격자에게 그렇게하지 못하게)에 토큰을 보낼 수 없다는 점이 중요합니다. 즉 토큰이 일반적으로 거기에 들어간 이유입니다. – le0diaz