PageSourceSearch

https://gwgs.go.kr/pcms/common/js/csrf.js?ver=26040701

js gwgs.go.kr collected 2026-10-02 17:48:38 UTC 3,193 bytes, 79 lines download raw bytes

1// ==========================================================
2// [전역 CSRF 토큰 확인 로직 - v3]
3// IE 모드 대응: 페이지 로드 시점에 미리 주입 + submit 시점 이중 방어
4// ==========================================================
5
6(function() {
7
8    function getCsrfToken() {
9        var metaToken = document.querySelector("meta[name='_csrf']");
10        return metaToken ? metaToken.getAttribute("content") : '';
11    }
12
13    // POST 폼에 csrfToken hidden input 주입 (multipart 포함 모두 hidden input 방식 사용)
14    // - multipart/form-data도 Spring CommonsMultipartResolver에서 getParameter()로 읽힘
15    function injectCsrfToken(formElem) {
16        var tokenValue = getCsrfToken();
17        if (!tokenValue) return;
18
19        var method = formElem.getAttribute('method');
20        if (!method || method.toUpperCase() !== 'POST') return;
21
22        if (!formElem.querySelector('input[name="csrfToken"]')) {
23            var hiddenInp = document.createElement("input");
24            hiddenInp.setAttribute("type", "hidden");
25            hiddenInp.setAttribute("name", "csrfToken");
26            hiddenInp.setAttribute("value", tokenValue);
27            formElem.appendChild(hiddenInp);
28        }
29    }
30
31    // [1번 방어막] 페이지 로드 완료 즉시 현재 DOM의 모든 POST 폼에 토큰 주입
32    // IE 모드에서 form.submit() 직접 호출 시 submit 이벤트가 발생하지 않으므로
33    // submit 시점이 아닌 로드 시점에 미리 주입하는 것이 핵심
34    function injectAll() {
35        var forms = document.getElementsByTagName('form');
36        for (var i = 0; i < forms.length; i++) {
37            injectCsrfToken(forms[i]);
38        }
39    }
40
41    if (document.readyState === 'loading') {
42        document.addEventListener("DOMContentLoaded", injectAll);
43    } else {
44        injectAll();
45    }
46
47    // [2번 방어막] submit 이벤트 캡처 (버튼 클릭 등 일반 제출 대비)
48    document.addEventListener("DOMContentLoaded", function() {
49
50        var csrfToken = getCsrfToken();
51        var csrfHeaderMeta = document.querySelector("meta[name='_csrf_header']");
52        var csrfHeader = csrfHeaderMeta ? csrfHeaderMeta.getAttribute("content") : '';
53
54        document.addEventListener('submit', function(e) {
55            if (e.target && e.target.tagName === 'FORM') {
56                injectCsrfToken(e.target);
57            }
58        }, true);
59
60        // [3번 방어막] AJAX 호출 감지 (jQuery)
61        if (typeof jQuery !== 'undefined') {
62            $(document).ajaxSend(function(e, xhr, options) {
63                if (csrfHeader && csrfToken) {
64                    xhr.setRequestHeader(csrfHeader, csrfToken);
65                }
66            });
67        }
68    });
69
70    // [4번 방어막] prototype 오버라이딩 (IE 외 브라우저에서 JS로 form.submit() 호출 시 보조)
71    try {
72        var originalSubmit = HTMLFormElement.prototype.submit;
73        HTMLFormElement.prototype.submit = function() {
74            injectCsrfToken(this);
75            originalSubmit.apply(this, arguments);
76        };
77    } catch(e) {}
78
79})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.