yuusuke-roughの日記

Java,SpringBoot,趣味等

CSRFトークンを用いたリクエスト送信ができなかった in SpringSecurity

はじめに

CSRFトークンを送信しても403が返ってくる事態に際して奮闘した2日間の記録である。

なお、コロナとも戦っていた模様。

 

内容

CSRFトークンを使用してリクエストを送信するコードを以下とした。

 

    var csrfToken = document.getElementById("_csrf").value;
        var token = csrfToken.replace("XSRF-TOKEN=", "")
        
        var header = "X-CSRF-TOKEN"
    
        var mail = document.getElementById("email").value
        
        const XHR = new XMLHttpRequest();
        XHR.open('POST', '/resetPassword?mail=' + mail)
        XHR.setRequestHeader(header, token)
        
        XHR.send()

 

Cookieに保存されているXSRF-TOKENから値を取り出し_csrfにセットするという物だが、403がでる。

 

原因を調べても全然ヒットしない。

その時に気づいた。

CookieXSRF-TOKENの値がずっと同じ...?」

CSRFトークンはログイン時に付与されるのでは...?」

「Remember-meと関係あるのかな...deleteCookiesで試してみよう」

 

と、さっそくlogout時にdeleteCookiesでXSRF-TOKENごと削除した。

すると、今度はCookieXSRF-TOKENがない...

結局、SessionのAttributesからトークンを持ってくる事にした。

 

DefaultCsrfToken token = (DefaultCsrfToken)    request.getSession().getAttribute("org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN"
            );