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

推薦する

Nginx リバース プロキシと負荷分散を実装する方法 (Linux ベース)

ここで nginx のリバース プロキシを試してみましょう。リバースプロキシ方式とは、インターネット...

CSS フォント、テキスト、リストのプロパティの詳細な紹介

1. フォントのプロパティcolorは、div{color:red;}のようにテキストの色を指定しま...

ホバー画像のポップアウトポップアップ効果を実現するための純粋な CSS のサンプルコード

実施原則メイングラフィックは、背景と前景の 2 つの要素で構成されています。次のサンプルコードでは、...

Vueでaxiosをカプセル化するいくつかの方法

目次ベーシックエディションステップ1: Axiosを構成するステップ2: リクエストをカプセル化する...

CSS シャドウアニメーションの最適化のヒント

このテクニックは、この記事から来ています - シルキーでスムーズなパフォーマンスでボックスシャドウを...

React ページ ターナーの実装 (フロント エンドとバックエンドを含む)

目次フロントエンド上記のアイデアに従って、ページめくり機能を設計して記述します。バックエンド(Jav...

あまり一般的ではないが便利な CSS 属性操作の完全ガイド

1. カスタムテキスト選択 ::選択{ 背景: 赤; 色: 黒; } 2. ビデオコントロールからダ...

Linux ファイアウォールの状態確認方法の例

Linuxファイアウォールの状態を確認する方法1. 基本操作 # ファイアウォールのステータスを表示...

Dockerを使用してSpring Bootプロジェクトをデプロイする手順

目次シンプルなSpringbootプロジェクトを作成する1. pom.xmlでSpring Boot...

TypeScript インターフェースの紹介

目次1. インターフェース定義2. 属性2.1 オプション属性2.2 読み取り専用プロパティ3. ク...

nginx ロードバランシングを介して https にリダイレクトする方法

ウェブ上で証明書とキーをコピーするscp -rp -P52113 /application/ngin...

CSS でテキストカラーグラデーションを実装する 3 つの方法

Web フロントエンド開発のプロセスでは、UI デザイナーはグラデーション テキストを使用したデザイ...

DockerToolBox ファイルマウント実装コード

docker を使用すると、ファイルをマウントできない場合があります。これは、仮想マシンの共有フォル...

タグのhref属性とonclickイベントの使用例

a タグは主にページ ジャンプを実装するために使用され、これは href 属性または onclick...

Vue ターンテーブル抽選の簡単な実装

この記事では、ホイール抽選を簡単に実装するためのVueの具体的なコードを参考までに共有します。具体的...