웹 페이지 CSRF 토큰 자동 삽입

2. 19 오후 4:43

  OWASP CSRFGuard는 CSRF 방어를 위해 클라이언트 측에서 JavaScript를 자동으로 삽입하여 CSRF 토큰을 추가할 수 있도록 지원합니다. 이를 통해 개발자는 별도로 CSRF 토큰을 수동으로 관리하지 않아도 됩니다.

다음은 CSRFGuard의 JavaScript를 이용한 CSRF 토큰 삽입 방법을 설명합니다.

1. CSRFGuard JavaScript 활성화 설정

CSRFGuard의 JavaScript 기능을 사용하려면 csrfguard.properties 파일에서 관련 설정을 활성화해야 합니다.

csrfguard.properties 설정 예제

# JavaScript 삽입 활성화
org.owasp.csrfguard.javascriptInjection=true

# JavaScript 서블릿 URL 설정
org.owasp.csrfguard.js.servlet=/csrfguard.js

# Ajax 요청 보호
org.owasp.csrfguard.Ajax=true

설명:

  • javascriptInjection=true → CSRF 토큰을 자동으로 추가할 수 있도록 JavaScript 기능 활성화.
  • js.servlet=/csrfguard.js → CSRF 토큰을 관리하는 JavaScript 파일을 제공하는 서블릿 설정.
  • Ajax=true → AJAX 요청에도 CSRF 보호 적용.

2. CSRFGuard JavaScript 서블릿 매핑 (web.xml 설정)

서블릿을 통해 CSRFGuard JavaScript를 제공해야 합니다.

web.xml에서 JavaScript 서블릿 매핑

<servlet>
    <servlet-name>CSRFGuardJsServlet</servlet-name>
    <servlet-class>org.owasp.csrfguard.servlet.JavaScriptServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>CSRFGuardJsServlet</servlet-name>
    <url-pattern>/csrfguard.js</url-pattern>
</servlet-mapping>

설명:

  • CSRFGuard의 JavaScriptServlet/csrfguard.js 경로로 매핑.

3. HTML 페이지에서 CSRFGuard JavaScript 포함

이제 CSRFGuard의 JavaScript를 HTML 페이지에 추가해야 합니다.

HTML에서 CSRFGuard JavaScript 로드

<script type="text/javascript" src="/csrfguard.js"></script>

설명:

  • 브라우저가 csrfguard.js를 로드하면 CSRF 토큰을 자동으로 처리.

4. CSRF 토큰 자동 삽입

CSRFGuard JavaScript는 form, a, button 태그 등에 자동으로 CSRF 토큰을 추가할 수 있습니다.

폼 자동 토큰 삽입

CSRFGuard JavaScript를 로드하면 <form> 태그에 자동으로 CSRF 토큰이 추가됩니다.

<form action="/submit" method="POST">
    <input type="text" name="username">
    <button type="submit">전송</button>
</form>

설명:

  • CSRFGuard가 <form> 태그를 감지하여 자동으로 CSRF 토큰을 추가.

5. JavaScript를 이용한 AJAX 요청 시 CSRF 토큰 삽입

CSRFGuard JavaScript는 AJAX 요청에도 CSRF 토큰을 자동으로 추가할 수 있습니다.
이를 위해 CSRFGuard JavaScript에서 제공하는 CsrfGuard 객체를 사용합니다.

AJAX 요청에서 CSRF 토큰 삽입 (jQuery 예제)

$.ajax({
    url: "/submit",
    type: "POST",
    data: JSON.stringify({ username: "testuser" }),
    contentType: "application/json",
    beforeSend: function(xhr) {
        xhr.setRequestHeader("OWASP-CSRF-TOKEN", CsrfGuard.getToken());
    },
    success: function(response) {
        console.log("Response:", response);
    }
});

설명:

  • beforeSend 콜백에서 CsrfGuard.getToken()을 사용하여 CSRF 토큰을 요청 헤더에 추가.

6. JavaScript를 이용한 수동 CSRF 토큰 삽입

자동으로 CSRF 토큰이 추가되지 않는 경우, 수동으로 삽입할 수도 있습니다.

JavaScript로 직접 CSRF 토큰 삽입 (일반적인 예제)

document.addEventListener("DOMContentLoaded", function() {
    let csrfToken = CsrfGuard.getToken();
    
    // 모든 폼에 CSRF 토큰 추가
    document.querySelectorAll("form").forEach(form => {
        let tokenInput = document.createElement("input");
        tokenInput.setAttribute("type", "hidden");
        tokenInput.setAttribute("name", "OWASP-CSRF-TOKEN");
        tokenInput.setAttribute("value", csrfToken);
        form.appendChild(tokenInput);
    });
});

설명:

  • 페이지 로드 후 모든 <form> 태그에 CSRF 토큰을 자동 추가.

7. CSRFGuard JavaScript 커스터마이징

CSRFGuard JavaScript는 csrfguard.properties에서 추가적인 설정을 할 수 있습니다.

커스텀 설정 예제 (csrfguard.properties)

# JavaScript가 자동으로 보호할 태그 설정
org.owasp.csrfguard.javascript.domains=example.com
org.owasp.csrfguard.javascript.inject.form=true
org.owasp.csrfguard.javascript.inject.anchor=true

설명:

  • 특정 도메인에서만 CSRFGuard JavaScript 활성화 (example.com).
  • form 태그에 자동으로 토큰 추가 (inject.form=true).
  • a 태그에도 CSRF 토큰 추가 (inject.anchor=true).

8. 결론

OWASP CSRFGuard의 JavaScript 기능을 활용하면 자동으로 CSRF 토큰을 삽입하고 AJAX 요청을 보호할 수 있습니다.

핵심 요약

  • csrfguard.properties에서 javascriptInjection=true 설정.
  • web.xml에서 /csrfguard.js 서블릿 매핑.
  • HTML에서 <script src="/csrfguard.js"> 추가.
  • CsrfGuard.getToken()을 사용하여 AJAX 요청에 토큰 삽입.
  • 필요한 경우 JavaScript를 이용해 수동으로 토큰을 폼에 추가.

이제 CSRFGuard의 JavaScript 기능을 활용하여 보안성을 더욱 강화해보세요!