Nginxの背後にあるTomcatアプリケーションサーバーがあります。 SSLはnginxで終了します。 TomcatにデプロイされたSpring web-mvcアプリケーションは、JSESSIONIDにセキュアフラグを設定する必要があります。 Springにこれを自動検出させる機能があればいいので、SSLがないので開発中に気にすることはありません。
Springにフラグを自動的に設定するよう指示する方法はありますか?
JavaConfigを使用してアプリケーションをセットアップし、Mavenを使用してデプロイ可能なwarファイルを作成します。
私はすでにこれをチェックしましたが、これは何となくくて静的に見えます: 'secure'フラグをJSESSION id cookieに設定
spring-session を使用する場合、例えばセッションをreddisで保持するために、これは実際に自動的に行われます。 Cookieはorg.springframework.session.web.http.CookieHttpSessionStrategy
CookieHttpSessionStrategy#createSessionCookie
リクエストがHTTPS経由かどうかを確認し、それに応じてセキュリティを設定します。
sessionCookie.setSecure(request.isSecure());
notspring-sessionを使用する場合、ServletContextInitializer
。 アプリケーションプロパティ を使用して、プロファイルに応じてtrue/falseに設定します。
@Bean
public ServletContextInitializer servletContextInitializer(@Value("${secure.cookie}") boolean secure) {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.getSessionCookieConfig().setSecure(secure);
}
};
}
application.properties(プロファイル「prod」がアクティブでないときにdevで使用されます):
secure.cookie=false
application-prod.properties(プロファイル「prod」がアクティブな場合にのみ使用され、application.propertiesの値を上書きします):
secure.cookie=false
prodサーバーでアプリケーションを起動するには:
--spring.profiles.active=prod
これまでにプロファイルを使用したことがない場合は多少の努力のように思えますが、とにかくprod環境のプロファイルが必要になる可能性が高いため、その価値は十分にあります。
Spring Bootを使用している場合、簡単な解決策があります。 application.properties
で次のプロパティを設定するだけです。
server.servlet.session.cookie.secure=true
ソース: Spring docs-付録A.一般的なアプリケーションプロパティ
HTTPSを使用する環境と使用しない環境がある場合、HTTPSを使用しないプロファイルでfalseに設定する必要があります。それ以外の場合、セキュアCookieは無視されます。
application.ymlに追加するだけです
server:
session:
cookie:
secure: true
別のオプションを追加
ServletContextInitializerを使用して、安全なCookieとHTTPのみのフラグを設定できます
@Bean
public ServletContextInitializer servletContextInitializer() {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
sessionCookieConfig.setSecure(true);
}
};
}