작성
·
465
·
수정됨
0
<body>
<form:form id="gotoPopupPreview" name="gotoPopupPreview" method="post" action="">
<input type="hidden" name="isPreview" value="Y">
<input type="hidden" name="nttId" value="${searchVO.nttId}">
...(생략)
</form:form>
<script>
function openPreview(url, target, otherData){
var f = $("#gotoPopupPreview");
f.attr('action', url);
f.attr('target', target);
...(생략)
window.open('', target);
f.submit();
}
$("submitBtn").click(function(){
var otherData = '어쩌구저쩌구';
openPreview("http://www.test.or.kr/", '테스트', otherData);
});
</script>
</body>
위 코드와 같이 form 태그를 만들어두고 스크립트에서 새 창을 열어 submit을 보냈습니다.
근데 서버에서 AccessDeniedException : org.springframework.security.web.csrf.MissingCsrfTokenException: Could not verify the provided CSRF token because your session was not found.
result :::: {"result" : "fail", "message" : "Could not verify the provided CSRF token because your session was not found."}
이렇게 csrf 토큰이 없다고 뜨네요..
처음엔 <input type="hidden" name="$csrf.parameterName}" value="${csrf.token}" />
이렇게 form태그 안에 직접 넣었다가 form taglib을 쓰면 자동으로 토큰을 넣어준다길래 위와 같이 바꾼건데요, 두 경우 모두 토큰이 잘 들어있는 것으로 보이는데 왜 저런 exception이 뜨는 지 모르겠습니다ㅠ
아무래도 새 창으로 띄우는 게 문제일까요? 이 경우에는 토큰을 어떻게 넣어줘야 할까요? T.T
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님의 질문을 잘 읽어보았습니다. Spring Security를 사용할 때 CSRF 토큰이 요구되는데, 새 창에서 form을 submit했을 때 CSRF 토큰이 없다는 에러가 발생했다고 하셨네요.
Spring Boot 기본 설정에서는 CSRF 보호 기능이 활성화되어 있어 POST
, PUT
, DELETE
같은 요청에 대해 서버가 CSRF 토큰을 검증하려고 합니다. 새 창에서 form을 submit할 때는 해당 토큰이 브라우저 세션과 함께 제대로 전달되어야 합니다.
현재 form 태그 안에 CSRF 토큰을 직접 넣거나, 태그라이브러리를 사용하여 자동으로 넣어주는 방식으로 했는데도 문제가 생기는 것 같습니다. 이는 해당 토큰이 요청과 함께 서버로 제대로 전달되지 않았기 때문일 수 있습니다.
새로운 창에서 요청을 보낼 때는 같은 세션을 공유하는지 확인해보시고, CSRF 토큰 값이 제대로 설정되어 있는지 다시 한번 확인해보세요. <form:form>
태그를 사용할 때는 method="post"
를 지정했기 때문에 자동으로 토큰이 포함되어야 하지만, 만약 리로딩 과정에서 토큰이 누락되거나 세션이 새로 생성되어 기존의 토큰과 매치되지 않는 경우 해당 에러가 발생할 수 있습니다.
또한, 서버에서 토큰 검증 과정에서 세션을 찾을 수 없다는 메시지가 나오기 때문에 세션이 유지되지 않은 상태에서 토큰이 서버로 전달되었을 수도 있습니다. 이 경우는 새 창을 열 때도 같은 세션을 사용하도록 주의해야 합니다.
CSRF 토큰 관련 문제를 해결하기 위해서는 아래 문서를 참고하시면 도움이 될 것 같습니다.
Spring Security Reference Guide - CSRF Protection
토큰이 잘 전달되고 있는지, 세션이 유지되고 있는지 디버깅을 통해 확인해보시기 바랍니다.