티스토리 뷰
✅ 명시적으로 CSRF 토큰을 추가하지 않았는데, submit 시 값이 넘어가는 이유?
전자정부프레임워크(Spring Security 기반)에서는 CSRF 토큰을 자동으로 추가하는 메커니즘이 있습니다.
따라서, <input type="hidden" name="_csrf" value="토큰값">을 명시적으로 추가하지 않아도 폼이 정상적으로 CSRF 토큰을 포함하여 제출될 수 있습니다.
🔹 이유 1: org.springframework.security.web.csrf.CsrfRequestDataValueProcessor 사용
Spring Security는 JSP의 <form> 태그를 자동으로 처리하여 CSRF 토큰을 추가하는 기능을 제공합니다.
이 기능은 org.springframework.security.web.csrf.CsrfRequestDataValueProcessor 클래스를 통해 동작합니다.
✅ 예제: <form>에 CSRF 토큰이 자동 추가되는 경우
<form:form action="/submit" method="post">
<form:input path="username"/>
<input type="submit" value="제출">
</form:form>
✔ 위 코드에서는 <input type="hidden" name="_csrf" value="토큰값">을 직접 추가하지 않았지만, Spring Security가 자동으로 삽입합니다.
🔹 이유:
spring-form 태그 라이브러리를 사용할 경우, Spring Security가 CsrfRequestDataValueProcessor를 활용하여 CSRF 토큰을 자동 추가하기 때문입니다.
🔹 이유 2: HiddenHttpMethodFilter를 통해 CSRF 토큰이 자동 삽입됨
Spring Security에서는 POST 요청 시 CSRF 토큰이 자동으로 추가되도록 HiddenHttpMethodFilter를 사용할 수 있습니다.
✅ CSRF 필터 동작 방식
- Spring Security가 서버에서 CSRF 토큰을 생성
- Spring의 HiddenHttpMethodFilter 또는 CsrfRequestDataValueProcessor가 이를 폼에 자동 추가
- 클라이언트가 <form>을 제출하면 Spring Security가 CSRF 토큰을 자동으로 확인
(1) web.xml에서 필터 설정 (XML 방식)
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
✔ 이 설정을 하면 CSRF 토큰이 자동으로 삽입됨
(2) Java 기반 WebConfig에서 설정 (Java 방식)
@Bean
public FilterRegistrationBean<HiddenHttpMethodFilter> hiddenHttpMethodFilter() {
FilterRegistrationBean<HiddenHttpMethodFilter> filterRegistrationBean = new FilterRegistrationBean<>(new HiddenHttpMethodFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
✔ Java 기반 설정을 사용해도 동일한 효과를 얻을 수 있음
🔹 이유 3: spring-security-taglibs 라이브러리 사용
JSP에서 Spring Security의 태그 라이브러리(spring-security-taglibs)를 포함하면, CSRF 토큰이 자동 추가됩니다.
✅ 예제: <spring:csrfMetaTags/>을 사용한 경우
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
✔ 이 태그를 추가하면, 자동으로 <meta> 태그로 CSRF 토큰이 추가됨
✔ 폼이 제출될 때, Spring Security가 자동으로 CSRF 토큰을 추가
💡 결론:
Spring Security가 CSRF 토큰을 자동으로 관리하며, <form> 태그를 처리할 때 JSP EL (_csrf.token)을 사용하거나, HiddenHttpMethodFilter를 통해 폼 데이터를 조작하여 자동으로 추가됩니다.
🔹 추가적으로 CSRF 토큰을 확인하는 방법
명시적으로 CSRF 토큰을 추가하지 않았지만, 실제로 넘어가는지 확인하는 방법은 다음과 같습니다.
✅ JSP에서 CSRF 토큰이 자동으로 추가되었는지 확인
<form:form action="/submit" method="post">
<form:input path="username"/>
<input type="submit" value="제출">
</form:form>
<sec:csrfMetaTags/>
✔ <sec:csrfMetaTags/>를 추가하면 자동으로 CSRF 토큰이 <meta> 태그로 삽입됨
✔ 크롬 개발자 도구에서 Elements를 확인하면, <form> 내부에 자동으로 CSRF 토큰이 삽입되었는지 확인할 수 있음
🔹 최종 정리
원인 설명
CsrfRequestDataValueProcessor 사용 | <form:form>을 사용할 경우 자동으로 CSRF 토큰 추가됨 |
HiddenHttpMethodFilter 적용 | Spring Security가 POST 요청 시 CSRF 토큰을 자동으로 포함 |
spring-security-taglibs 사용 | <sec:csrfMetaTags/>로 <meta> 태그에 CSRF 토큰이 추가됨 |
JSP EL로 자동 삽입 | ${_csrf.token}을 통해 CSRF 토큰이 자동 설정됨 |
✅ CSRF 토큰이 자동으로 넘어가는 이유:
- Spring Security가 내부적으로 CSRF 토큰을 관리하고 <form>에 자동 추가
- spring-form 태그 라이브러리를 사용하면, CsrfRequestDataValueProcessor가 자동으로 동작
- AJAX 요청 시 meta 태그에 CSRF 토큰이 저장되고, 이를 사용하여 전송 가능
💡 결론:
✔ Spring Security가 CSRF 토큰을 자동 관리하기 때문에 <input type="hidden" name="_csrf" value="토큰값">을 명시적으로 추가하지 않아도 제출 시 자동으로 포함됩니다. 🚀
- Total
- Today
- Yesterday
- excel
- draw.io
- caniuse
- PostgreSQL
- $.extend
- 여러 컬럼 update
- setter
- oracle
- object key
- getter
- border-collapse
- 진열사랑
- springboot
- ul li로 테이블
- sumifs
- element위치
- @ExceptionHandler
- lombok
- Javascript
- $.each
- 프로젝트명변경
- 정규식
- devtools
- 전후방탐색
- CSS
- JQuery
- QueryDSL
- DatePicker
- spring
- Keycode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |