티스토리 뷰

카테고리 없음

CSRF 토큰 자동추가 방법?

진열사랑 2025. 3. 21. 00:31

명시적으로 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 필터 동작 방식

  1. Spring Security가 서버에서 CSRF 토큰을 생성
  2. Spring의 HiddenHttpMethodFilter 또는 CsrfRequestDataValueProcessor가 이를 폼에 자동 추가
  3. 클라이언트가 <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
링크
«   2025/04   »
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
글 보관함