Print
카테고리: [ Cloud Computing & MSA ]
조회수: 89041

1. 개요

Spring boot를 사용한 개발 중 ajax post 통신시에 403에러가 계속 발생. 해당 에러를 해결하는 방법 제시.

 

2. 환경

* Java - 1.8.0_202

* Spring boot version : 2.3.1

* Spring Security를 사용한 사용자 인증 사용

 

3. 해결 방법

Spring Security를 사용중에 ajax post 통신을 통해 DB의 자료를 수정하려고 했으나 계속해서 403에러가 발생했다.

Path나 권한의 문제인가 싶어서 permitAll()을 사용해 보았는데도 계속 에러가 발생했다. 

알고보니 이는 csrf(Cross-site request forgery)의 token이 누락으로 발생하는 것이였다. 

해결을 위해서는 아래와 같이 Header에 token값을 넣어주면 된다.

* html meta 추가
<meta name="_csrf" th:content="${_csrf.token}">
<meta name="_csrf_header" th:content="${_csrf.headerName}">

* .js 에 아래 추가 
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(header, token); });

* csrf ? *

사용자가 A 서비스에 로그인 하면 브라우저에 A 서비스의 로그인 관련 쿠키 정보가 남게 되고, 동일 브라우저에서 악의적인 코드가 있는 B 서비스로 접속시 B 서비스의 페이지에서 A 서비스로 임의의 권한이 필요한 Request를 전송 할 수 있다.

이런 문제를 해결하기 위해 A 서비스에서 Response시 Token을 발행, 그 다음 Request에 발행된 Token이 Header에 없으면 권한이 없는 요청으로 인식하도록 하는 것.

설명 출처 - https://www.popit.kr/spring-security-ajax-%ED%98%B8%EC%B6%9C-%EC%8B%9C-csrf-%EA%B4%80%EB%A0%A8-403-forbidden-%EC%97%90%EB%9F%AC/