舞台裏

Qiita が表でこっちが裏。こっそりやっていく。

CSRF のトークンを Cookie にした場合の secure 属性の指定

よく考えたら記事に書いてなかったなぁと仕事中に思い出したので調べた。

<csrf> タグの属性とかで指定できるのかなぁと思ったら、 IntelliJ の補完で属性が3つしか表示されない。

f:id:opengl-8080:20170512233842j:plain

しかたないので実装(CookieCsrfTokenRepository)を見に行ったら、↓のようになってた。

   @Override
    public void saveToken(CsrfToken token, HttpServletRequest request,
            HttpServletResponse response) {
        ...
        Cookie cookie = new Cookie(this.cookieName, tokenValue);
        cookie.setSecure(request.isSecure());
        ...
    }

HttpServletRequest#isSecure() の値をそのままセットしている。

isSecure()ServletRequest に定義されているメソッドで、 Javadoc を見るとリクエストの通信が保護されているかどうかを返すらしい。

ServletRequest (Java(TM) EE 7 Specification APIs)

例は HTTPS 通信ということで、 HTTPS 通信だったら勝手に secure 属性が有効になるっぽい。

下手にオプションで切り替えるよりも、こっちのほうが設定漏れもなくて確実な気がした。グッドプラクティスっぽい。