서버에 CSRF 토큰 생성 및 검증 적용

2. 19 오후 4:42

OWASP CSRFGuard는 Java 기반 웹 애플리케이션에서 Cross-Site Request Forgery(CSRF) 공격을 방지하기 위한 라이브러리입니다. 다음은 CSRFGuard의 사용법을 자세히 설명한 가이드입니다.

1. OWASP CSRFGuard 개요

CSRFGuard는 요청마다 고유한 CSRF 토큰을 생성하여 요청이 유효한지 검증하는 방식으로 CSRF 공격을 방어합니다. 이 라이브러리는 필터(Filter) 기반으로 동작하며, 요청을 가로채어 검증하는 역할을 합니다.

2. CSRFGuard 설치 방법

(1) CSRFGuard 라이브러리 다운로드

OWASP CSRFGuard의 최신 버전은 GitHub 또는 Maven Repository에서 받을 수 있습니다.

Maven을 사용하는 경우 (pom.xml 설정)

<dependency>
    <groupId>org.owasp</groupId>
    <artifactId>csrfguard</artifactId>
    <version>4.0.0</version>
</dependency>

(버전은 최신 버전으로 변경)

직접 다운로드하는 경우

  • csrfguard-x.x.x.jar 파일을 직접 다운받아 프로젝트의 /WEB-INF/lib/ 폴더에 추가.

3. CSRFGuard 설정 및 적용 방법

(1) web.xml 필터 등록

CSRFGuard는 Servlet Filter를 이용해 요청을 감시합니다.

web.xml 설정 예제

<filter>
    <filter-name>CSRFGuard</filter-name>
    <filter-class>org.owasp.csrfguard.CsrfGuardFilter</filter-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>/WEB-INF/csrfguard.properties</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>CSRFGuard</filter-name>
    <url-pattern>/*</url-pattern> <!-- 모든 요청 감시 -->
</filter-mapping>

설명:

  • configFile: CSRFGuard의 설정 파일 (csrfguard.properties)의 경로 지정.
  • url-pattern: 보호할 URL 패턴 지정.

(2) csrfguard.properties 설정

이 파일에서 CSRF 방어 정책을 정의합니다.

csrfguard.properties 기본 설정 예제

# CSRFGuard 활성화 여부
org.owasp.csrfguard.Enabled=true

# 보호할 HTTP 메서드
org.owasp.csrfguard.ProtectedMethods=POST,PUT,DELETE

# 토큰을 GET 요청에서도 사용 (기본값: false)
org.owasp.csrfguard.ProtectedGet=false

# CSRF 토큰 이름
org.owasp.csrfguard.TokenName=OWASP-CSRF-TOKEN

# 토큰을 어디에 저장할지 지정 (Session, Request)
org.owasp.csrfguard.TokenPerPage=false
org.owasp.csrfguard.TokenPerRequest=false

# Ajax 요청을 보호하는 기능 활성화
org.owasp.csrfguard.JavaScriptCacheControl=no-cache
org.owasp.csrfguard.Ajax=true

설명:

  • ProtectedMethods: 보호할 HTTP 메서드를 지정.
  • TokenName: CSRF 토큰의 이름을 정의.
  • Ajax: AJAX 요청도 보호할지 여부.

(3) CSRF 토큰을 폼에 적용

JSP/HTML에서 CSRF 토큰 추가

CSRFGuard는 폼 데이터에 자동으로 CSRF 토큰을 추가할 수 있습니다.
하지만 직접 추가하려면 다음과 같이 설정합니다.

<form action="/submit" method="POST">
    <input type="hidden" name="OWASP-CSRF-TOKEN" value="<%= session.getAttribute('OWASP-CSRF-TOKEN') %>" />
    <input type="text" name="username" />
    <button type="submit">전송</button>
</form>

설명:

  • OWASP-CSRF-TOKEN 값을 세션에서 가져와서 폼에 포함.

(4) AJAX 요청에서 CSRF 토큰 포함

AJAX 요청을 보낼 때도 CSRF 토큰을 함께 보내야 합니다.

JavaScript 예제

function sendData() {
    let token = document.cookie.match('(^|;)\\s*OWASP-CSRF-TOKEN\\s*=\\s*([^;]+)')?.pop() || '';

    fetch('/submit', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'OWASP-CSRF-TOKEN': token
        },
        body: JSON.stringify({ username: 'testuser' })
    }).then(response => response.json())
      .then(data => console.log(data));
}

설명:

  • 쿠키에서 OWASP-CSRF-TOKEN을 가져와 fetch 요청의 헤더에 추가.

4. CSRFGuard 테스트

설정이 올바르게 동작하는지 확인하려면 다음 테스트를 수행하면 됩니다.

(1) 정상적인 요청 테스트

  1. 브라우저에서 CSRF 토큰이 포함된 폼을 제출한다.
  2. 서버에서 정상적으로 요청을 처리하면 성공.

(2) CSRF 공격 테스트

  1. CSRF 토큰이 없는 요청을 외부에서 보낸다.
  2. 서버에서 403 Forbidden 에러가 발생하면 정상 작동.

5. CSRFGuard 설정을 강화하는 방법

(1) RefererOrigin 체크 활성화

org.owasp.csrfguard.ValidateReferer=true
org.owasp.csrfguard.ValidReferer=yourdomain.com

설명:

  • 요청의 Referer 값이 지정한 도메인(yourdomain.com)과 일치하는지 검사.

(2) JSON 응답을 위한 CORS 설정

org.owasp.csrfguard.CORSHeader=true
org.owasp.csrfguard.CORSHeaderName=Access-Control-Allow-Origin

설명:

  • CORS 관련 헤더를 추가하여 JSON API 요청도 보호.

6. 결론

OWASP CSRFGuard는 간단한 설정으로 강력한 CSRF 보호 기능을 제공합니다.
핵심 요약:

  1. 필터(web.xml)를 등록하여 모든 요청 감시.
  2. 설정 파일(csrfguard.properties)을 수정하여 보호 정책 설정.
  3. 폼과 AJAX 요청에 CSRF 토큰 추가하여 인증된 요청만 허용.
  4. 테스트를 통해 CSRF 차단이 정상 동작하는지 확인.

이제 OWASP CSRFGuard를 활용하여 웹 애플리케이션의 보안을 강화하세요!