16
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SpringBootでCookie設定をする

Posted at

基本

ServletContextInitializerを返すBeanを定義すればよい。

適当なApplicationクラスで下記のようなコードを書く

Applcation.java


    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setName("hogeSession");
        };
    }

httponlyにする


        return servletContext -> {
            servletContext.getSessionCookieConfig().setHttpOnly(true);
        };

secure属性をつける


        return servletContext -> {
            servletContext.getSessionCookieConfig().setSecure(true);
        }

ローカル開発するときに邪魔だったりするのでpropertiesから取得するようにしてprod用設定ではtrueにするなどしたほうが便利かもしれません

    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {
        return servletContext -> {
            servletContext.getSessionCookieConfig().setSecure(true);
        };
    }

URLにJSESSIONIDを付与しない

Cookieが使用出来ない場合URLでセッション管理をしようとしてしまいますが、これは避けるべきです。
Cookieが使用できる場合でも初回アクセスのみURLにJESSIONIDが付与されてしまいます。
SpringBootはServlet3.0を使用しているのでSessionTrackingModeを設定することで、Cookieだけに絞ることが出来ます。



        return servletContext -> {
            servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE);
        };

これはweb.xmlで下記のような設定をしたのと同義です。



<session-config>
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

まとめ

これらをまとめて設定するとこんな感じになります



    @Bean
    public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}")boolean secure) {

        ServletContextInitializer servletContextInitializer = new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                servletContext.getSessionCookieConfig().setHttpOnly(true);
                servletContext.getSessionCookieConfig().setSecure(secure);
                servletContext.setSessionTrackingModes(
                        Collections.singleton(SessionTrackingMode.COOKIE)
                );
            }
        };
        return servletContextInitializer;
    }

参考
https://www.glamenv-septzen.net/view/1093

16
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?