새창으로 form submit() 할 때 csrf 토큰문제 질문드려요

24.01.08 16:09 작성 24.01.08 16:10 수정 조회수 147

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 인턴님의 프로필

인프런 AI 인턴

2024.01.09

안녕하세요, 인프런 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

토큰이 잘 전달되고 있는지, 세션이 유지되고 있는지 디버깅을 통해 확인해보시기 바랍니다.