Cookie 解析ツール
Cookie ヘッダー・Set-Cookie・cookies.txt を貼り付けると、値のデコード、ブラウザーが各 Cookie を保存するか拒否するかとその理由、次のリクエストで送られる Cookie ヘッダーを表示。マスク済みコピーも。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
例:PHP の setcookie() が返した Set-Cookie を読む
Docker の公式イメージ php:8.4-cli(PHP 8.4.26)で setcookie() を呼び、curl -i で受け取ったヘッダーです(2026-10-02 実測。セッション Cookie だけ PHPSESSID に名前を変えています)。
Set-Cookie: PHPSESSID=r4k8vq2m9n1p6s3t0w5x7y2z4b; path=/; secure; HttpOnly; SameSite=Lax
Set-Cookie: name=%E5%B1%B1%E7%94%B0%20%E5%A4%AA%E9%83%8E; expires=Wed, 21 Oct 2026 07:28:00 GMT; Max-Age=1656519; path=/
Set-Cookie: cart=deleted; expires=Thu, 01 Jan 1970 00:00:01 GMT; Max-Age=0; path=/
- 1 行目は Secure・HttpOnly・SameSite=Lax がそろい、警告は出ません。属性名が小文字(
path、secure)でも区別なく読まれます。 - 2 行目の値は「山田 太郎」をパーセントエンコードしたもので、空白は
%20になっています。expiresとMax-Ageが両方あり、Max-Age が優先されますが、どちらも 2026-10-21 07:28:00 UTC を指しています。Secure と HttpOnly がない点は警告されます。 - 3 行目は
setcookie('cart', '')の出力です。PHP は値をdeletedにして 1970 年の日付とMax-Age=0を付けるので、ツールは「削除」と判定します。
例:Shift_JIS のまま入った値と同名の PHPSESSID
PHPSESSID=r4k8vq2m9n1p6s3t0w5x7y2z4b; connect.sid=s%3Aabc.def; name=%8ER%93c; PHPSESSID=guest
name=%8ER%93cは「山田」を Shift_JIS のままurlencode()した値です。UTF-8 として読めないため、ツールは元の値のまま表示して注記します。UTF-8 なら%E5%B1%B1%E7%94%B0になります。PHPSESSIDが 2 つあります。JSON のオブジェクトは最初の値を取り、$_COOKIE['PHPSESSID']と同じになります。connect.sidは PHP では$_COOKIE['connect_sid']として届きます。PHP は名前のドットと空白をアンダースコアに置き換えるためで、ツールはその旨を表示します(PHP 8.4.26 で確認)。- 「マスク済みをコピー」を「セッション ID とトークンだけ」にすると、
PHPSESSIDとconnect.sidの値が[redacted]になり、nameは残ります。
属性ごとのブラウザーの扱い
| 属性 | ツールが適用するルール |
|---|---|
Expires | RFC 6265bis §5.1.1 の日付アルゴリズムで読みます。2026-10-21T07:28:00Z のような ISO 形式は読めず、セッション Cookie になります。日本時間ではなく GMT で書きます。 |
Max-Age | Expires より優先。0 以下は削除。400 日を超える有効期間は 400 日に(Chrome は 104 以降)。 |
Domain | 先頭のドットは無視。省略すると発行元のホストだけ、指定するとすべてのサブドメインに送られます。Public Suffix List にあるパブリックサフィックスは拒否されます。https://www.example.co.jp/ からの sid=x; Domain=co.jp は拒否、リストの PRIVATE 部にある Domain=github.io も同じです。Domain がレスポンスのホストと同じときは host-only になります(RFC 6265bis §5.7 ステップ 9)。 |
Path | 省略時や / で始まらないときは、レスポンス URL のディレクトリ。 |
SameSite | 省略時、Chrome 80 以降・Edge 86 以降は Lax、Firefox・Safari は違います(MDN の互換性データ)。None には Secure が必要。 |
Partitioned | Secure が必要(CHIPS)。Chrome 114 以降、Firefox 141 以降、Safari 26.2 以降。 |
| 名前のプレフィックス | __Secure- は Secure、__Host- は Secure・Path=/・Domain なし、__Http- と __Host-Http- はさらに HttpOnly が必要(Chrome 140 以降、Firefox 143 以降)。大文字小文字は区別しません。 |
| サイズ | 名前と値の合計が UTF-8 で 4096 バイトを超えると無視。日本語は 1 文字 3 バイトです。属性の値が 1024 バイトを超えると、その属性だけ無視。 |
Chrome が仕様と違う点(実測)
2026-10-02、ローカルのテストサーバーから Chromium 152 に各行を送り、実際に保存された Cookie を読み出しました。日付・サイズ・プレフィックス・SameSite=None・Partitioned は RFC 6265bis どおりで、違ったのは次の点です。ツールは RFC に従って判定し、これらに当たる行には注記を付けます。
Max-Age=+60:RFC では無視、Chromium は 60 秒として扱います。- 値の途中のタブ:RFC では可、Chromium は拒否します。
Domain=.:RFC では空のドメイン(host-only)、Chromium は拒否します。- 既存の Cookie を上書きすると、Chromium は作成時刻を新しくするため、先に設定された Cookie の後ろに回ります。RFC は元の作成時刻を引き継ぎます。
サーバー側の読み方
| 読み手 | 同名の Cookie | "引用符付き" の値 | 値の中の空白 |
|---|---|---|---|
PHP 8.4 の $_COOKIE(setcookie の説明) | 最初の値 | 引用符を残す | 残す |
Express 5 の req.cookies(cookie-parser 1.4.7、cookie 0.7.2) | 最初の値 | 引用符を外す | 残す |
| Python 3.12 の http.cookies | 最後の値 | 引用符を外す | ヘッダー全体を捨てる |
ほかの Cookie 解析ツールとの違い
2026-10-02、Bing で「cookie 解析 ツール」の 1 位だった Torinoa Tools ほか、英語・中国語・韓国語の上位を含む 5 つのツールに同じ入力を貼り付けました。どれもサーバーには送信していません。Torinoa Tools の「Set-Cookie ヘッダー形式」に 3 行を貼ると 1 つの Cookie にまとめられ、Max-Age の欄が「0 Set-Cookie: __Host-csrf=x 秒」になりました。1 行ずつ貼った場合も、SameSite=None に Secure がないことや、__Host- に Domain があることへの指摘はなく、Max-Age=0 は「0 秒」と表示されるだけで削除の意味は書かれません。ほかの 4 つも、拒否される Cookie を指摘しませんでした。
制限
- パブリックサフィックスは Public Suffix List の固定版(2026-10-01、ICANN 部と PRIVATE 部、ワイルドカードと例外ルールを含む)で判定します。リストは頻繁に更新されるため、その後に追加されたサフィックスはツールに入っていません。ブラウザーも内蔵のリストをそれぞれの周期で更新します。リストは圧縮後で約 45 KB で、Set-Cookie か cookies.txt を初めて解析するときに読み込みます。読み込み前や失敗したときは、Domain 属性のある Cookie を「未確認」とし、リクエストのシミュレーションに含めず、Domain も判定しません。
- シミュレーションは、各 Set-Cookie がトップレベルのページのレスポンスから来て、それ以前に Cookie がない前提です。SameSite を書かない新しい Cookie を Chrome が 2 分間だけクロスサイトの POST に付ける例外は扱いません。
- 有効期間は貼り付けた時点から数えます。
- ブラウザー拡張がエクスポートする JSON は読みません。Cookie ヘッダーか cookies.txt を貼り付けてください。
FAQ
Cookie ヘッダーに同じ名前が 2 つあるのはなぜですか?
ブラウザーは名前・ドメイン・パスの組で Cookie を区別します。Path=/ で設定した PHPSESSID と Path=/mypage で設定した PHPSESSID は別の Cookie で、/mypage 以下へのリクエストには両方が付き、パスの長いほうが先になります。PHP の $_COOKIE と Express は最初の値、Python の http.cookies は最後の値を使います。古いほうを消すには、Domain と Path を同じにして Max-Age=0 を付けた Set-Cookie を返します。
Set-Cookie を返したのにブラウザーに Cookie が残らないのはなぜですか?
よくある原因は、SameSite=None なのに Secure がない、__Host- の Cookie に Domain がある・Path が / でない、Domain がレスポンスのホストを含まない、http:// のページから Secure 付きの Cookie を設定した、名前と値が 4096 バイトを超えた、のいずれかです。その行をレスポンス URL と一緒に貼り付けると、カードに「拒否」と理由が出ます。
Expires と Max-Age の両方があるとどちらが使われますか?
Max-Age です。Expires は無視されます。Max-Age=0 または負の値は削除の指示です。PHP の setcookie() は両方を出力しますが、同じ時刻を指しているので結果は変わりません。有効期間は最長 400 日に切り詰められます。
SameSite を書かないとどうなりますか?
Chrome 80 以降と Edge 86 以降は SameSite=Lax として扱い、他サイトのリンクから来たときは送りますが、クロスサイトの iframe・fetch・フォーム POST には付けません。Firefox と Safari はクロスサイトでも送ります。ブラウザーごとの差をなくすため、明示してください。
貼り付けた Cookie はどこかへ送られますか?
送られません。解析はブラウザー内で行い、ページはその内容を含むリクエストを一切送らず、保存もしません。Cookie にはセッション ID が含まれることが多いため、このページは Google アナリティクスと AdSense を読み込みません。問い合わせに貼るときは「マスク済みをコピー」で値を [redacted] に置き換えてください。