nginx クッキーの有効期間に関する議論の要約

nginx クッキーの有効期間に関する議論の要約

訪問するたびにブラウザにCookieが生成されますが、 Cookieの存在はユーザーにとって良いことでしょうか、それとも悪いことでしょうか?正直に言うと、この存在は一連の問題を引き起こします。興味深いのは、ほぼすべてのサイトでCookieを離れるのが難しいことです。Cookie Cookie使用は、一見単純な外見のため、簡単に過小評価されてしまいます。最近、開発プロセス中に、アプリケーション内のCookieコードを見直したところ、わずかなコストで大きなセキュリティ上のメリットが得られることがわかりました。記憶を深めるためにこのメモを書いてください。

クッキーのセキュリティリスク

実際のアプリケーション シナリオでは、 Cookie最もよく使用されるのは、ID 認証のサーバー ステータスを維持することです。この保持はセッションSessionまたは永続的になります。ただし、いずれにしても、認証Cookieに含まれるサーバーTicketが漏洩すると、サーバーでは、このチケットを含むユーザー要求が実際のユーザーからのものか、悪意のある攻撃者からのものかを識別することが難しくなります。

実際のケースでは、 Cookie漏洩を引き起こす最も一般的な方法は、クロスサイト スクリプティング (XSS、クロス サイト スクリプトなど) の脆弱性によるものです。攻撃者は、小さなJavaScriptコードを通じて、ユーザー ID を表す重要なCookie識別子を盗むことができます。クロスサイト スクリプティングの脆弱性は非常に一般的であるため (単純なHTML Encodeクロスサイト スクリプティングを回避できると考えないでください。クロスサイト スクリプティングは非常に奥が深いテーマであり、業界ではクロスサイト スクリプティングという特別な用語が生まれています)、ほとんどすべての Web サイトがこれを回避することはできません。そのため、この方法は実際にはよく使用される手段です

実際、この問題を回避するための最初の秘訣は、 CookieHttpOnlyタグを付けるために可能な限りのことを行うことです。 HttpOnlyの具体的な使用法については、この記事の範囲外です。

クッキーの仕組み

初めてウェブサイトにアクセスすると、ブラウザはリクエストを送信します。サーバーがリクエストに応答すると、応答リクエストにCookieが挿入されます。ブラウザが 2 回目のリクエストを送信すると、 Cookieが渡されます。サーバーはユーザーを識別します。もちろん、サーバーはCookie内容を変更することもできます。

クッキーのライフサイクル

Cookieを作成すると、 CookieExpireという値が割り当てられます。これは、 Cookieの有効期間、つまりCookieのライフサイクルを指定します。設定されたライフサイクルを超えると、 Cookieクリアされます。 Expire値を0または負の値に設定すると、ブラウザを閉じるとCookieクリアされるため、より安全な方法となります。

クッキーの有効期間を変更する

通常、 webアプリケーション サービスはnginxを通じて公開されます。このとき、 nginx上の設定ファイルを変更することで、 cookieの有効期限を変更できます。著者は最近、 openrestyをベースにnginx用の機能を開発しています。 Cookieの有効期間をテストする良い機会です。

前述のCookieのライフサイクルの通り、有効期間のセキュリティを確保するために、 Cookieに合理的な有効期間を設定することができます。 0または負の値の場合、どのような影響がありますか?見てみましょう

改造のアイデア

変更するには、 Openrestyresty.cookieを使用します。このライブラリは、 OpenResty上でHTTP cookieを操作するために使用されます。 NginxHTTP Cookie headerを解析し、 Cookie内の各フィールドを返すために使用できます。たとえば、 namevaluehttponlyなどの属性を設定する

24時間有効

ここで、 expires 1 日(24h)の有効期間に設定されています。これは、現在のシステム時間(ngx.time())に 24 時間を加えた時間です。

 ローカルクッキー = resty_cookie:new()

 ローカル OK、エラー = cookie:set({
  キー = "middle_session",
  値 = セッション、
  パス = "/",
  安全 = 偽、
  httponly = true、
  有効期限 = ngx.cookie_time(ngx.time() + 60 * 60 * 24)、
  ドメイン = ngx.host、
 })

効果

ここで、 cookieの有効期間は 5 月 13 日の 14:04 であることがわかります。これは、変更した構成が有効であり、このパラメータを使用してCookie変更できることを意味します。この時点に達すると、 Cookie無効になり、ユーザーは再度ログインする必要があります。

Genesisに有効

ここで、 expires -1 に設定されています。この Cookie は、UNIX 時代のメタタイムである 1970 年に使用されていることがわかります。

 ローカルクッキー = resty_cookie:new()

 ローカル OK、エラー = cookie:set({
  キー = "middle_session",
  値 = セッション、
  パス = "/",
  安全 = 偽、
  httponly = true、
  有効期限 = ngx.cookie_time(-1)、
  ドメイン = ngx.host、
 })

下の図から、 Cookie 1970 年 1 月 1 日まで有効であることがわかります。これは、この時点では間違いなく古くなっています。もちろん、これは本番環境での構成です。小さな暗い部屋に閉じ込められ、命の価値について話し合うことになります。このようなCookie設定に遭遇した場合、ユーザーはどうやっても正常にログインできなくなります。

現在まで有効

ngx.cookie_time Cookie有効期限として使用できるフォーマットされた文字列を返すため、有効期限を手動で指定します。この方法を使用すると、上記の自動Cookie消去の効果をテストできます。

有効期限を-1に指定する

 ローカルクッキー = resty_cookie:new()

 ローカル OK、エラー = cookie:set({
  キー = "middle_session",
  値 = セッション、
  パス = "/",
  安全 = 偽、
  httponly = true、
  有効期限 = -1、
  ドメイン = ngx.host、
 })

有効期限を0に指定する

 ローカルクッキー = resty_cookie:new()

 ローカル OK、エラー = cookie:set({
  キー = "middle_session",
  値 = セッション、
  パス = "/",
  安全 = 偽、
  httponly = true、
  有効期限 = 0、
  ドメイン = ngx.host、
 }) 

結論は

ここで-10設定することは、実質的にはメタ時間を設定することと同じですが、暗い部屋に閉じ込められる必要がないという利点があります。 Cookie現在のページでのみ有効です。ブラウザを閉じると、 Cookieブラウザによって消去されます。この時点では、セキュリティ上の問題を心配する必要はありません。

参考資料:

クッキーセキュリティに関する話https://www.infoq.cn/article/cookie-security

クッキーについてわかりやすく話しましょう https://juejin.im/post/59d1f59bf265da06700b0934

クッキーのセキュリティに関する簡単な説明 https://zhuanlan.zhihu.com/p/58666986

nginx クッキーの有効期間に関する議論のまとめはこれで終わりです。nginx クッキーの有効期間に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • nginx を使用して Cookie のクロスドメイン アクセスを解決する方法
  • nginx ログに Cookie 情報を追加する方法について

<<:  CentOS7 に YUM 経由で MySQL 5.7 をインストールする詳細な手順

>>:  ネイティブJSが様々なスポーツの均一な動きを実現

推薦する

MySql 5.7.20 のインストールとデータおよび my.ini ファイルの構成

1. まずMySqlの公式サイトからダウンロードします参考: https://www.jb51.ne...

MySQL グリーンバージョン設定コードと 1067 エラーの詳細

MySQL グリーンバージョン設定コードと 1067 エラーMySQL エンコーディングを表示 &#...

Vueはel-tree遅延読み込みを使用して、追加、削除、変更、クエリ機能を実装します。

Vue のツリー表示については、プロジェクトが使用されています: エフェクト ダイアグラムがツリー...

JavaScript キャンバスで動的な点と線の効果を実現

この記事では、動的な点と線の効果を実現するためのJavaScriptキャンバスの具体的なコードを参考...

MySql8.0バージョンに接続するMyBatisの設定問題について

mybatis を学習しているときにエラーが発生しました。エラーの内容は次のとおりです。データベース...

jQuery+swiper コンポーネントはタイムラインのスライド年タブ切り替え効果を実現します

結果: 実装コード: スワイパーコンポーネントと一緒に使用する必要がありますSwiper 基本デモア...

大規模なウェブサイトアーキテクチャを設計・構築する際に考慮すべき10の課題

ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...

HTMLタグIDは変数にできる

<table id=" <%=var1%>">、var1...

MySQL データベースは XA 仕様をどのように実装しますか?

MySQL 一貫性ログMySQL データベースの電源が切れた場合、コミットされていないトランザクシ...

JavaScript 配列の include と Reduce の基本的な使用法

目次序文配列.プロトタイプ.includes文法パラメータ戻り値例配列プロトタイプの削減文法パラメー...

WeChatアプレットはウォーターフォールフローのページングスクロール読み込みを実装します

この記事では、WeChatアプレットのウォーターフォールフローページングスクロールロードを実装するた...

webpackのモバイル適応ソリューションの概要

目次レムフォルクスワーゲンサードパーティのUIフレームワークに適応する結論モバイル開発における最も一...

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...

Docker tomcatのメモリサイズを設定する方法

Docker に Tomcat をインストールする場合、大きなファイルをダウンロードするときなど、場...

VMware Workstation のダウンロードとインストールの詳細なチュートリアル

仮想マシンは非常に便利なテストソフトウェアです。ハードウェアに損傷を与えることなく、さまざまなテスト...