서버에 CSRF 토큰 생성 및 검증 적용
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) 정상적인 요청 테스트
- 브라우저에서 CSRF 토큰이 포함된 폼을 제출한다.
- 서버에서 정상적으로 요청을 처리하면 성공.
(2) CSRF 공격 테스트
- CSRF 토큰이 없는 요청을 외부에서 보낸다.
- 서버에서 403 Forbidden 에러가 발생하면 정상 작동.
5. CSRFGuard 설정을 강화하는 방법
(1) Referer 및 Origin 체크 활성화
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 보호 기능을 제공합니다.
핵심 요약:
- 필터(
web.xml)를 등록하여 모든 요청 감시. - 설정 파일(
csrfguard.properties)을 수정하여 보호 정책 설정. - 폼과 AJAX 요청에 CSRF 토큰 추가하여 인증된 요청만 허용.
- 테스트를 통해 CSRF 차단이 정상 동작하는지 확인.
이제 OWASP CSRFGuard를 활용하여 웹 애플리케이션의 보안을 강화하세요!