Accept-Language Reduction のオリジン トライアルに参加する

Accept-Language の削減は、Accept-Language ヘッダーでユーザーの言語設定を削減し、ユーザーが最も好む言語(1 つだけ)のみを送信することで、パッシブ フィンガープリント サーフェスを削減する取り組みです。

Chrome 109 ベータ版より、Accept-Language の削減に関するオリジン トライアルが開始されます。これにより、サイトは削減された Accept-Language ヘッダーの受信をオプトインできるようになります。これにより、今後のリリースで Chrome のデフォルトの動作として Accept-Language の削減が適用される前に、サイトが問題を検出して修正できるようになります。安定したユーザーにリリースされる前にこの機能をテストするには、Chrome 109 のリリース日(現在は 2023 年 1 月 10 日に予定されています)より前にオプトインしてテストしてください。

以下に、削減前と削減後の Accept-Language ヘッダーの例を示します。

現在
Accept-Language: en-GB,en;q=0.9,de;q=0.8,fr;q=0.7
提案済み
Accept-Language: en-GB

オリジン トライアルの概要と、想定される動作は次のとおりです。この変更に関するフィードバックや、オリジン トライアル中に発生した問題は、Accept-Language Reduction GitHub リポジトリで共有できます。

Accept-Language とは何ですか?

Accept-Language 文字列はすべての HTTP リクエストで共有され、ブラウザによって読み込まれるすべてのリソースに JavaScript で公開されます。現在、ユーザーのすべての優先言語が含まれています。

Accept-Language が削減されるのはなぜですか?

Accept-Language の削減は、Chrome のパッシブ フィンガープリント サーフェスを削減するための取り組みです。

現在、Accept-Language ヘッダーはすべての HTTP リクエストでデフォルトで共有され、ブラウザによって読み込まれるすべてのリソースに JavaScript で公開されます。ユーザーのすべての言語設定が含まれています。サイトがマルチリンガル コンテンツを提供する場合に、ユーザーが設定した言語のリスト全体をブラウザが送信するのではなく、サイトがマルチリンガル コンテンツを示す新しい方法を導入します。ブラウザは言語ネゴシエーションを実行し、優先言語を表示します。

もう 1 つの理由は、多くのサイトが言語ネゴシエーションに Accept-Language ヘッダーを使用していない可能性があることです(たとえば、ある調査では、上位 10,000 サイトのうち Accept-Language を使用しているサイトは 7.2% のみです)。Chrome シークレット モードでは、すでに Accept-Language が 1 つに減らされています。

ウェブ デベロッパーへの影響

Accept-Language に依存して言語ネゴシエーションを行っているサイトは、Accept-Language の削減に対応する準備をし、オリジン トライアルへの参加を検討する必要があります。削減された Accept-Language 値は、次の場所に表示されます。

  • Accept-Language HTTP リクエスト ヘッダー。
  • navigator.languages JavaScript ゲッター。

ブラウザが言語ネゴシエーションを担当し、ユーザーが希望する言語を選択してサイトに送信します。これを実現するには、サイトがレスポンス ヘッダーに 2 つのヘッダー Variants(言語をサポートするサイトを示す新しいヘッダー)Accept-LanguageContent-Language を追加する必要があります(下記の詳細な例を参照)。

Accept-Language のプランの削減は現在のところ iOS と WebView には適用されず、これらのプラットフォームでは引き続きユーザーの Accept-Language の完全なリストが取得されます。これらのプラットフォームのサポートは、今後予定されています。

Accept-Language の削減に関するオリジン トライアル

オリジン トライアルでは、参加サイトがレスポンスでトークンを提供する必要があります。このトークンは、指定されたトライアルを有効にするようブラウザに指示します。ただし、これは、ブラウザがサイトに対して最初のリクエストを送信した時点で、サイトがオリジン トライアルに参加しているかどうかを把握する方法がないことを意味します。つまり、セッションの最初のリクエストでは、圧縮された Accept-Language header は送信されません。そのページのサブリソースに対するリクエスト(同一オリジンとクロスオリジンの両方)には、削減された Accept-Language ヘッダーが送信されます。その後の同一オリジンのナビゲーションでも、圧縮された Accept-Language ヘッダーが受信されます。クロスオリジン ナビゲーションは完全なヘッダーの送信に戻りますが、ページ内のクロスオリジン リクエスト(サードパーティの iframe リクエストなど)は、最上位のフレーム リクエストに有効なオリジン トライアル トークンが含まれている場合、引き続き圧縮された Accept-Language ヘッダーを送信します。

これは、ユーザー エージェントの情報量削減のオリジン トライアルに似ています。Chromium 内部の実装について詳しくは、Reduce Accept-Language HTTP ヘッダーの実装をご覧ください。

Accept-Language の削減に関するオリジン トライアルに参加する

詳しくは、Chrome のオリジン トライアルの開始をご覧ください。基本的な手順は次のとおりです。

ステップ 1

オリジン トライアルに登録してドメインのトークンを取得するには、Accept-Language の削減に関するトライアルのページをご覧ください。

ステップ 2

HTTP レスポンス ヘッダーを更新します。

  1. HTTP レスポンス ヘッダーに Origin-Trial: <ORIGIN TRIAL TOKEN> を追加します。ここで、<ORIGIN TRIAL TOKEN> には、オリジン トライアルの登録時に取得したトークンを指定します。
  2. HTTP レスポンス ヘッダーに Content-Language を追加して、オーディエンス向けの言語を指定します。
  3. HTTP レスポンス ヘッダーに Variants を追加して、サイトがサポートする言語を指定します。
  4. [省略可] HTTP レスポンスに Vary: Accept-Language を追加して、コンテンツ ネゴシエーションのキャッシュキーを作成します。
  5. これらのヘッダーを設定すると、指定された送信元に対してのみ、ブラウザの言語ネゴシエーション(初期リクエストの再起動の可能性)がトリガーされます。サイトにユーザーに適した言語の表現を表示するには、ユーザーの Accept-Language ヘッダーに基づいてコンテンツを送信するサイトも更新する必要があります(以下の例を参照)。

ステップ 3

Chrome M109 ベータ版(以降)でウェブサイトを読み込み、短縮された Accept-Language 文字列の受信を開始します。

問題やフィードバックがある場合は、Accept-Language の削減に関する GitHub リポジトリに送信してください。

デモ

オリジン トライアルを有効にした多言語サイトのデモ(ソースコードを含む)については、https://reduce-accept-language.glitch.me/ をご覧ください。

オリジン トライアルのオプトインとオプトアウトのデモ(ソースコードを含む)については、https://reduce-accept-language-ot.glitch.me/ をご覧ください。

たとえば、example.comja(日本語)と en(英語)をサポートしています。リクエストは次のいずれかです。

GET / HTTP/1.1
Host: example.com
Accept-Language: en

サイトは、ユーザーの accept-language に基づいて、ユーザーが英語のコンテンツを好むことを認識しています。レスポンス ヘッダーには次のものがあります。

HTTP/1.1 200 OK
Content-Language: en
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token

ユーザーが日本語のコンテンツを優先している場合、リクエストは次のようになります。

GET / HTTP/1.1
Host: example.com
Accept-Language: ja

この場合、サイトは日本語コンテンツのヘッダーで応答します。

HTTP/1.1 200 OK
Content-Language: ja
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token

サーバーサイドでは、サイトが特定の言語のサポートを探しているが、サポートが検出されなかった場合はデフォルトに戻る場合があります。

if(accept_language == 'ja') {
    res.response('ja_page')
}
else {
   res.response('en_page')
}

上記の例では、example.comAccept-Language の値に基づいて en または ja のいずれかで応答し、一致するものがない場合のデフォルトは en です。この場合、サイトは Accept-Language の値に基づいて、対応する言語ページ(/en または /ja)へのリダイレクトも提供できます。リダイレクトに関連する詳細な例については、実装ドキュメントをご覧ください。

サードパーティのオリジンのトライアルのサポート

現在、トライアルのサードパーティとしてドメインを登録することはできません。オリジン全体でサブリソースとして実装されているサービス(広告配信やアナリティクスなど)を運用している場合、トップレベル サイトがオリジン トライアルに参加している場合にのみ、削減された Accept-Language ヘッダーが送信されます。

オリジン トライアルが機能していることを確認する

Chrome のオリジン トライアルのトラブルシューティングのガイドでは、トークンが正しく設定されていることを確認するためのチェックリストがすべて用意されています。

複数の言語とその優先度は、chrome://settings/languages または [設定] > [言語] で設定します。サイトがサポートしていない言語を選択し、その言語をリストの一番上に移動して、追加の再交渉がトリガーされるようにすることを検討してください。

オリジン トライアル トークンを含む最初のレスポンスのヘッダーは次のようになります。

Accept-Language を削減したリクエスト ヘッダーのスクリーンショット。

削減された Accept-Language を含む後続のリクエスト ヘッダーは次のようになります。

送信元のトライアル トークンを含む最初のレスポンスのヘッダー。

オリジン トライアルへの参加を停止する

トライアル期間中はいつでも参加を停止し、ユーザーの Accept-Language の完全なリストを受け取ることができます。参加を停止するには:

  1. HTTP レスポンスから、Accept-Language 削減トライアルの Origin-Trial ヘッダーを削除しました。
  2. [省略可] このヘッダーを送信しない場合は、HTTP レスポンスでオリジン トライアルを有効にするために追加される Variants ヘッダーを削除します。空の値で Variants を使用して、この操作を行うこともできます。
  3. [省略可] このヘッダーを送信しない場合は、HTTP レスポンスでオリジン トライアルを有効にするために追加される Content-Language ヘッダーを削除します。

オリジン トライアルの期間

Accept-Language の削減に関するオリジン トライアルは、少なくとも 6 か月間(Chrome マイルストーンに換算すると約 6 回)実施されます。オリジン トライアルは M109 で開始され、M114 で終了します(トライアルを利用できる最後の Chrome リリースを意味します)。その時点で、Chrome はオリジン トライアルからのフィードバックを評価してから、削減された Accept-Language 文字列を段階的に送信します。まず、Accept-Language HTTP ヘッダーを削減し、次に JS インターフェースを削減します。サイトにテストにさらに時間が必要である場合は、その後のサポート終了元のトライアルにオプトインできます。これにより、少なくとも 6 か月間、Accept-Language 文字列全体にアクセスできます。サポート終了トライアルの詳細については、準備ができ次第公開する予定です。

フィードバックを共有

問題やフィードバックがある場合は、Accept-Language の削減に関する GitHub リポジトリに送信してください。