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が様々なスポーツの均一な動きを実現

推薦する

マージントップ崩壊現象とその具体的解決策

マージントップの崩壊とはmargin-top の崩壊は、CSS ボックス モデルで発生する現象です。...

Linux での MySQL 5.6.33 のインストールと設定のチュートリアル

このチュートリアルでは、LinuxでのMySQL 5.6.33のインストールと設定方法を参考までに紹...

Ubuntu 20.04 では、隠し録音ノイズ低減機能が有効になります (推奨)

最近、 Ubuntu 20.04でkazamを使用して録音しているときに、問題が見つかりました。シス...

Vue の element-ui コンポーネントのデフォルトの CSS スタイルを変更する 4 つの方法

目次序文1. グローバル統合オーバーライドを使用する2. .vueファイルを変更する3. コンポーネ...

CentOS ベースの OpenStack 環境の展開に関する詳細なチュートリアル (OpenStack のインストール)

エフェクト表示: 環境準備コントローラーノード: 6GB 4時間60GB/30GB/30GB計算ノー...

Docker のタイムゾーンの問題とデータ移行の問題

最新のソリューション: -v /usr/share/zoneinfo/Asia/Shanghai:/...

Reactコンポーネントのライフサイクル機能についての簡単な説明

React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...

jsはシンプルなカウントダウンを実装します

この記事の例では、参考までに簡単なカウントダウンを実装するためのjsの具体的なコードを共有しています...

Webフロントエンドベクターアイコンの使い方

序文フロントエンドページを書くとき、小さなアイコンなどの画像を使うことが多いです。画像を使うとコード...

Windows 10 無料インストール版の MySQL インストールと設定のチュートリアル

ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージョンと一致し...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

ポータルサイトのフォーカス画像のデザインに関するいくつかの結論

フォーカス画像は、画像、テキスト、動的なインタラクティブ効果を統合したコンテンツを表示する方法です。...

JavaScript コンストラクタとプロトタイプの関係

目次1. コンストラクタとプロトタイプ1. コンストラクター2. コンストラクタ問題3. コンストラ...

nginxリバースプロキシのマルチポートマッピングの実装

コードの説明1.1 http:www.baidu.test.com のデフォルトは 80 で、リバー...

フローティング要素が親要素の高さを崩す原因と解決策の詳細な説明

フローティング要素は、親要素の高さを縮小します。要素を float float:left/right...