본문 바로가기

Backend/Spring | SpringBoot

[Spring Security] CSRF갱신

반응형

파일 다운로드 기능이 연동되어야 해서 GET방식으로 ajax를 진행해야 해서 CSRF갱신에 애를 먹었다

Controller단

/**
     * 다운로드 CSRF방지
     *
     * @param HttpServletRequest
     * @return
     * @throws
     */
    @GetMapping("/refreshCsrfToken")
    public ResponseEntity<String> refreshCsrfToken(HttpServletRequest request) {
        CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf");
        String newToken = csrfToken.getToken();
        return ResponseEntity.ok(newToken);
    }

 

JS단

// csrf토큰 획득
function fn_downloadTemplate() {
    $.ajax({
        url: '/refreshCsrfToken',
        type: 'GET',
        success: function (newToken) {
            $("meta[name='_csrf']").attr("content", newToken);
            downloadFile(newToken);
        }
    });
}
// csrf토큰 재획득
function refreshGet(){
    $.ajax({
        url: '/refreshCsrfToken',
        type: 'GET',
        success: function (newToken) {
            $("meta[name='_csrf']").attr("content", newToken);
        }
    });
}
// 다운로드 작업
function downloadFile(csrfToken) {
    const token = $("meta[name='_csrf']").attr("content");
    const header = $("meta[name='_csrf_header']").attr("content");
    $.ajax({
        url: '/data/excelDown.do',
        method: 'GET',
        xhrFields: {
            responseType: 'blob'
        },
        beforeSend: function (xhr) {
            xhr.setRequestHeader(header, csrfToken);
        },
        success: function (data, status, xhr) {
            var disposition = xhr.getResponseHeader('Content-Disposition');
            var filename = '';
            if (disposition && disposition.indexOf('attachment') !== -1) {
                var matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(disposition);
                if (matches != null && matches[1]) {
                    filename = matches[1].replace(/['"]/g, '');
                }
            }
            var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument
            .spreadsheetml.sheet'});

            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = filename;
            link.click();
            // 작업 후 csrf토큰 재갱신
            refreshGet();
        },
        error: function (xhr, status, error) {
        }
    });
}

 

 

+ ) DB에서 VARCHAR타입으로 정렬이 안될때

인코딩의 문제일수도 있다고 함

MariaDB의 경우에는 다음과 같이 처리할 수 있음

select table_kor_name, * from cdp_cust_data_variable
	order by table_kor_name collate "ko_KR.utf8";

 

 

 

반응형

'Backend > Spring | SpringBoot' 카테고리의 다른 글

Tomcat 에러  (0) 2024.02.19
[Spring] 예외처리(Exception Handler)(2)  (0) 2023.11.30
[Spring] 예외처리(Exception Handler)(1)  (0) 2023.11.28
[Spring] RedirectAttributes  (0) 2023.11.07
[Spring] SQLErrorCodesFactory  (0) 2023.10.06