【Chrome135】訪問済のリンクが訪問済になったりならなかったりする

[Partitioning :visited links history](https://github.com/explainers-by-googlers/Partitioning-visited-links-history)という提案があります。
2025年4月にリリースされる[Chrome135](https://chromiumdash.appspot.com/schedule)で[有効になる機能](https://chromestatus.com/feature/5101991698628608)です。

これ実はユーザにわりと影響のある変更なのですが、全く知られておらず話題にも上がっていないんですよね。
なにせ日本語記事が一切見当たらない。

ということで、ここで紹介しておきます。

# 具体的にどうなるの？

まず[Google](https://www.google.com/search?q=PHP8.4%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E6%96%B0%E6%A9%9F%E8%83%BD%E5%85%A8%E9%83%A8%E3%82%84%E3%82%8B)と[YahooJapan](https://search.yahoo.co.jp/search?p=PHP8.4%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%81%AE%E3%81%A7%E6%96%B0%E6%A9%9F%E8%83%BD%E5%85%A8%E9%83%A8%E3%82%84%E3%82%8B)で同じ語句を検索します。
ここでは例として[PHP8.4がリリースされたので新機能全部やる](https://qiita.com/rana_kualu/items/9c4d476a4c044bac265f)を使います(宣伝)。

この記事を見たことがない場合、リンクは未訪問です。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/2bb3af3d-86aa-4303-80de-86aefcddc905.png)

ここでGoogleから記事へのリンクを踏むと、YahooJapanから該当記事へのリンクも訪問済になります。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/595702a5-3185-490b-bd9d-44e8674caae6.png)


当然ですね。


それでは[chrome://flags/](chrome://flags/#partition-visited-link-database)から`partition-visited-link-database`を有効にしましょう。
これはChrome134以下でも`Partitioning :visited links history`を有効化するフラグです。

その後Googleからリンクを踏むと、Google側のリンクは訪問済みになります。

ところがYahooJapanからのリンクは未訪問のままです。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/f4c0dc32-3534-452a-a253-ba977758a3f0.png)

なんで？


# どうしてこんなことをする必要が？

かつては疑似クラス`:visited`のプロパティをJavaScriptやCSSから[取得することが可能](https://developer.mozilla.org/ja/docs/Web/CSS/Privacy_and_the_:visited_selector)でした。
その結果どうなったかというと、もちろん[隠しリンクを](https://takagi-hiromitsu.jp/diary/20081211.html#p01)[大量に並べて](http://bakera.jp/ebi/topic/3298)[ユーザの訪問履歴を奪取](https://blogs.itmedia.co.jp/yasusasaki/2009/08/153ad4u-c251.html)することでフィンガープリントしたりやターゲティング広告したりする攻撃が蔓延ることになりました。

その対策として、最終的に[`:visited`プロパティは取得できないように](https://hacks.mozilla.org/2010/03/privacy-related-changes-coming-to-css-vistited/)なり、また[ほとんどのプロパティは設定もできない](https://developer.mozilla.org/ja/docs/Web/CSS/:visited)ようになりました。
取得しようとすると常に未訪問というステータスが返ります。
設定できない理由は、たとえば`height`などを変更すれば訪問済かどうかを簡単に判別できてしまうからですね。

ここで問題が終わればよかったのですが、実際はそれだけで解決することはなく、たとえば[CSS transitionで訪問済を抜く](https://issues.chromium.org/issues/40055758)、[Ambient Light Sensorを使って画面の明るさで訪問済か判断する](https://arturjanc.com/ls/)、[タイミング攻撃](https://www.usenix.org/sites/default/files/conference/protected-files/woot18_slides_smith.pdf)などの脆弱性がその後も頻発することになりました。

また特に斬新なものとして[こんなものもあります](https://varun.ch/posts/history)。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/92bf2870-1277-4d8c-ad34-2261ca43a8c2.png)

よくあるCAPTCHA認証に見えますが、実際は黒が`:visited`リンクとなっており、つまりユーザが訪問済サイトを自己申告してくれるという代物です。
これに至ってはブラウザ側で防ぐことすらできません。

ということで、本問題に対して、ついに根本的な対策が行われることになりました。


# [Explainer: Partitioning :visited links history](https://github.com/explainers-by-googlers/Partitioning-visited-links-history?tab=readme-ov-file)

本提案をひとことでまとめると、訪問済かどうかを判定する基準が、これまで『リンク先サイト』だけだったところを、『リンク元サイト+リンク先サイト』に変更します。

考え方としてはCookieのパーティショニング[CHIPS](https://github.com/privacycg/CHIPS)と[だいたい同じ](https://qiita.com/rana_kualu/items/8d8e8cd0d4737e7884e3)です。

この変更によってどうなるかというと、サイトAからサイトXへのリンクを踏んだ場合、その後サイトAからサイトXへのリンクは訪問済になります。
しかしサイトBからサイトXへのリンクは未訪問のままです。
たとえばさきほどの[CAPTCHA認証のふりをした攻撃サイト](https://varun.ch/posts/history)では、全てのリンクが常に未訪問ということなります。
攻撃サイトに訪問履歴が流出することがなくなりました。

もちろん自分の所有するWebサイトからリンクを辿って行ったユーザの情報は取得できるわけですが、これはそもそもクリックを取得するなりでどうとでもできるので本提案の対象外です。
問題は、自サイトから訪れたわけではない訪問済サイトがわかってしまうことだったので、この問題については完全解決されました。


# 他ブラウザの反応

[Firefoxはポジティブ](https://github.com/mozilla/standards-positions/issues/1040)であり、おそらくそのうち実装されます。
そもそも本提案の原案となった`:visited`プロパティ設定・取得制限を[率先して行った](https://dev.mozilla.jp/2010/04/privacy-related-changes-coming-to-css-vistited/)のがMozillaですからね。

[Safari](https://github.com/WebKit/standards-positions/issues/363)はいまのところ方針を決めていませんが、[妥当だろう](https://github.com/WebKit/standards-positions/issues/363#issuecomment-2200571582)とは言っているのでいずれ対応されると思います。


# ユーザへの影響

最初に言ったとおりの問題が発生します。

『サイトAからサイトXに行ったら、サイトAからサイトXへのリンクは訪問済なのに、サイトBやCからサイトXへのリンクは未訪問』

たとえば複数の個人リンク集サイトから情報収集している人なんかが、「あれ？これさっき見たはずなのに訪問済じゃないぞ？」ってなりそうです。


# 感想

本提案そのものは妥当な変更であると、個人的には思います。

ただ、けっこうユーザに影響のある大きな変更だと思うのですが、そのわりにユーザへの周知などは全然行われていません。
理由としては[許容可能な範囲だろうからまあいいんじゃね](https://github.com/w3ctag/design-reviews/issues/896#issuecomment-2652192468)だそうです。
さすがにもうちょっと発信してほしいところですね。