logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

より安全なリクエストヘッダー-メタデータの取得リクエストヘッダー

作成者:カランカラン2019年4月1日 9:00
ホーム/フロントエンド
💡

質問やフィードバックがありましたら、フォームからお願いします

英語原文

目次

  1. 再び同一生成元ポリシー(CORS)について
  2. ヘッダーの仕様:
    1. 1. Sec-Fetch-Dest
    2. 2. Sec-Fetch-Mode
    3. 3. Sec-Fetch-Site
    4. 4. Sec-Fetch-User
  3. ヘッダーを削除する方法はありますか?
  4. 結論

本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

ある日、ウェブページを開発しているとき、リクエストヘッダーの項目が正しいか確認するために開発ツールを開いたところ、いくつかの怪しいヘッダーがリクエストに追加されているのを発見しました。

network

怪しい点に気づきましたか?よく見ると、Sec-Fetch-* で始まるヘッダーが3つもあることに気づきました。 これは私の注意を引きました。これらのヘッダーは設定していないし、他の関数も適用していないのに、なぜ勝手に追加されているのか、ブラウザが関与しているのではないかと推測しました。

調べてみたところ、これは Fetch Metadata Request Headers という新しい草案であることが分かりました。現在、これらのヘッダーはChromeでのみ追加され、FirefoxやSafariでは追加されません。

再び同一生成元ポリシー(CORS)について

私たちは、ブラウザが悪意のある人物によるデータの盗用を防ぐために、特定のオリジンへのアクセス条件を制限していることを知っています。例えば、クロスオリジンリクエスト時には Access-Control-Allow-Origin を追加する必要があり、またPreflightリクエストも必要です。詳細は私が以前書いた「CORSとCookieの対処法」を参照してください。

それにもかかわらず、いくつかの欠陥があります。例えば、<img/> はクロスオリジンリクエストを送信できてしまうため、悪意のある人物がCORSの制限を回避することが可能です。当然、サーバーが基本的な防御策を講じていれば、大部分の不正なリクエストを防止できます。

リクエストを送信するときに、追加のヘッダー情報(metadata)を付加してリクエストの出所を示せれば、サーバーはそのヘッダーに基づいて適切な応答を行うことができるため、このような草案が生まれました。

ヘッダーの仕様:

現在、草案には主に4つのヘッダーがあります:

1. Sec-Fetch-Dest

このリクエストの目的地を示します。

可能な値には、audio、document、font、image、object、serviceworker などがあります。これにより、サーバーはリクエストの出所が合法かどうかを瞬時に判断できます。例えば、<img> からのリクエストでサーバーに画像を要求していない場合、ほぼ確実にハッカーであるため、エラーを返すことができます。

2. Sec-Fetch-Mode

リクエストのモードを示します。主にcors、navigate、nested-navigate、no-corsなどがあり、リクエストがどのようなモードであるかを判断します。これは fetch の中のmodeに似ています。

また、Set-Fetch-User により、ユーザーが操作(例えばクリックやキーボードなど)を通じてリクエストを発信したかどうかも知ることができます。

3. Sec-Fetch-Site

リクエストの出所が同一生成元かクロスオリジンかを示します。

4. Sec-Fetch-User

このヘッダーの値はブール値で、リクエストが navigation request(リクエストの目的地がdocument)であり、かつユーザーがインタラクションを行った場合(例えばボタンを押す、キーボード操作など)にのみtrueになります。サーバーはこのヘッダーに基づいて、ユーザーがリクエストを発信する方法が合法であるかどうかを判断できます。

例えば、フォームをクリックして送信する際、documentからリクエストが送信され、ユーザーがインタラクションを行ったため(ボタンをクリックして送信)、Set-Fetch-User は ?T になります。

ヘッダーを削除する方法はありますか?

もしこの草案が規範となった場合、ヘッダーを削除することはできない可能性があります。また、手動で設定してヘッダーの値を書き換えることはできません。なぜなら、それは forbidden headers の一つだからです。

結論

以前は、同様のことを実現するためにカスタムヘッダーを使用していましたが、偽造される可能性がありました。また、カスタムヘッダーを追加するにはPreflightのチェックが必要で、手間が増えました。規範に基づく利点は、これらのヘッダーが容易に書き換えられないことであり、統一された標準を提供することです。これらのヘッダーがあれば、バックエンドはリクエストを受け取る際にさらに多くの判断を行い、安全性を高めることができます。

← golangアプリでログを収集して一元化する方法オーバーフローアンカーによるボトムコンポーネントへのピンの実装 →

この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

☕Buy me a coffee

目次

  1. 再び同一生成元ポリシー(CORS)について
  2. ヘッダーの仕様:
    1. 1. Sec-Fetch-Dest
    2. 2. Sec-Fetch-Mode
    3. 3. Sec-Fetch-Site
    4. 4. Sec-Fetch-User
  3. ヘッダーを削除する方法はありますか?
  4. 結論