web-dev-qa-db-ja.com

春にJSESSIONID Cookieに安全なフラグを自動的に追加します

Nginxの背後にあるTomcatアプリケーションサーバーがあります。 SSLはnginxで終了します。 TomcatにデプロイされたSpring web-mvcアプリケーションは、JSESSIONIDにセキュアフラグを設定する必要があります。 Springにこれを自動検出させる機能があればいいので、SSLがないので開発中に気にすることはありません。

Springにフラグを自動的に設定するよう指示する方法はありますか?

JavaConfigを使用してアプリケーションをセットアップし、Mavenを使用してデプロイ可能なwarファイルを作成します。

私はすでにこれをチェックしましたが、これは何となくくて静的に見えます: 'secure'フラグをJSESSION id cookieに設定

10
ST-DDT

spring-session を使用する場合、例えばセッションをreddisで保持するために、これは実際に自動的に行われます。 Cookieはorg.springframework.session.web.http.CookieHttpSessionStrategyCookieHttpSessionStrategy#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は無視されます。

2
Jonask

application.ymlに追加するだけです

server:
  session:
    cookie:
      secure: true
0
AYR1112013

別のオプションを追加

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);
        }
    };
}
0
Khoa Phung