基本
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;
}