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 シーケンス AUTO_INCREMENT の詳細な説明とサンプルコード

MySQL シーケンス AUTO_INCREMENT の詳細な説明とサンプルコードMySQL シーケ...

MySQL で JSON 形式のフィールドをクエリする詳細な説明

作業開発プロセス中に、顧客の名前、携帯電話番号、ID カード、およびドキュメントの種類を動的に保存す...

mysql での rpm インストールの詳細な説明

インストールとアンインストールの表示 # rpm -qa | grep mysql を表示 # アン...

Linux カーネル デバイス ドライバー カーネル デバッグ テクニカル ノート集

/****************** * カーネルデバッグ技術 ****************...

HTML内の画像はbase64でエンコードされた文字列に直接置き換えられます

最近、画像はあるのに外部画像リソースが参照されていないウェブページを見つけました。気になりました。コ...

回転するフリップカードアニメーションの効果を実現するCSS

回転フリップ効果の CSS アニメーション、具体的な内容は次のとおりです。 1. まず2つのボックス...

HTML フォーム_PowerNode Java アカデミー

1. フォーム1. フォームの役割HTML フォームは、さまざまな種類のユーザー入力を受け取り、ユー...

史上最も簡単な MySQL データのバックアップと復元のチュートリアル (パート 2) (パート 37)

データのバックアップと復元パート3の詳細は次のとおりです基本的な概念:バックアップ、現在のデータまた...

js Promise同時制御メソッド

目次質問背景アイデアと実装質問次のように、同時実行 Promise の数を制御するメソッドを記述する...

Vueの子コンポーネントが親コンポーネントのメソッドを呼び出す場合の詳細な説明

1. 子コンポーネントのthis.$parent.eventを通じて親コンポーネントメソッドを直接呼...

Ubuntu でパスワードを変更し、パスワードの複雑さのポリシーを設定する方法

1. パスワードを変更する1. 一般ユーザーのパスワードを変更する パスワード現在のパスワードを入力...

Web ページ制作におけるテーブル属性 CellPad、CellSpace、Border の説明と使用

cellspacing は表内のセル間の距離です。セルパディングは、表のセル内の空白スペースです。一...

IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

css-vars-ポニーフィルCSS 変数を使用して Web ページのスキニングを実現すると、互換...

MySQL データをエクスポートおよびインポートするための HeidiSQL ツール

場合によっては、SQL へのデータのエクスポートとインポートを容易にするために、特定のツールを使用し...

Linux でパスワードを入力せずに sudo コマンドを実行する方法

sudo コマンドを使用すると、信頼できるユーザーは別のユーザー (デフォルトでは root ユーザ...