Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

텐의 개발 블로그

[Spring Legacy] 스프링시큐리티 Post 전송시, 403 금지됨 에러 해결방법 본문

Spring Legacy

[Spring Legacy] 스프링시큐리티 Post 전송시, 403 금지됨 에러 해결방법

ten99 2023. 6. 7. 16:27

저번 포스팅에서 Spring Legacy&스프링시큐리티를 이용하여 로그인 및 회원가입을 구현하였습니다.

Spring Security를 이용한 로그인 및 회원가입 페이지

로그인 및 회원가입 자체에는 문제가 없었지만 기존 페이지의 검색같은 Post 전송 방식을 사용할때 에러가 뜨는것을 확인하였습니다. 

List 페이지의 검색기능

현재 검색기능 구현을 위해서 Post 방식으로 form을 컨트롤러로 전송하고 있습니다. Spring Security를 적용하지 않으면 에러가 뜨지 않지만 Spring Security만 적용하면 아래와 같은 "HTTP 상태 403" - 금지됨이라는 에러가 발생하였습니다.

상황을 정리하자면 아래와 같습니다.

- Spring Security를 적용하면 에러가 발생한다.

- 허가된 권한을 가지고 List 페이지에 들어와 Post 방식의 form 전송을 하였는데 에러가 발생한다.

 

위 상황에 대한 문제해결 방법은 간단했습니다.

애초에 회원가입 또는 로그인을 구현할때 csrf 토큰을 같이 넣어줬었는데 기존 만들어둔 페이지에 로그인 및 회원가입을 추가하는 방식이다보니 기존에 있던 페이지의 form에 csrf토큰을 안넣어버렸습니다....

 

csrf는 간단하게 설명하자면 Cross-site request forgery의 약자로 크로스-사이트 요청 위조를 의미합니다. csrf 기능을 사용하게 되면 서버는 csrf토큰을 임의로 세션에 저장합니다. 그리고 이후에 변경요청의 파라미터에 담긴 csrf 토큰값과 세션에 저장된 토큰값을 비교하여 일치하는지에 대해서 검증을 진행합니다.

 

즉, 스프링 시큐리티 적용후에 403 에러가 발생한다면 세션에 저장된 csrf 토큰과 변경요청의 파라미터의 csrf 토큰값의 값이 다르거나 값이 아예 없어서 접근이 거부된다고 판단할수 있습니다.

 

해당 문제를 해결하기 위해서 2가지 정도의 방법이 있습니다.

1.  security-context.xml에서 csrf 기능을 비활성화 한다.

<sec:http use-expressions="true"> 
	<sec:csrf disabled="true" />
</sec:http>

간단하게 security-context.xml에서 <sec:csrf disabled="true" />를 추가해주시면 됩니다.

<sec:csrf disabled="false" />  csrf 활성화
<sec:csrf disabled="true" /> csrf 비활성화

 

2.  Post 전송을 진행할 form에 csrf 토큰 넣어주기

<form class="form-inline" action="${cpath}/board/list" method="post">
	<sec:csrfInput/>
</form>

form 안에 그냥 <sec:csrfInput/>를 넣으시면 됩니다. <sec:csrfInput/>를 추가하게 되면 form안에 csrf 토큰이 추가되게 됩니다.

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

다만 위와 같은 Spring Security 태그라이브러리를 JSP에 추가해주셔야 합니다.

Comments