1. SafariのHTTP警告画面と「戻る」ボタンの挙動
iPhoneのSafariで検索中、意図せずHTTPサイトをタップしてしまいました。Safariに「この接続は安全ではありません」という警告が表示され、画面内の「戻る」ボタンで検索結果に戻りました。
その際、Safari下部の戻る矢印を先に押したのですが、一度では検索結果に戻れなかったように感じました。これはなぜでしょうか。また、このような操作をしてしまったことで、セキュリティ上の問題が生じている可能性はありますか。
補足として、警告画面で「続ける」は押しておらず、個人情報やパスワードの入力、アプリのインストール、通知の許可などは一切行っていません。
iPhoneのSafariで検索中、意図せずHTTPサイトをタップしてしまい、戻る矢印を押したのに検索結果へ一発で戻れなかった、という相談がありました。
これはブラウザのセッション履歴の構造から生じる自然な現象で、不具合やマルウェア感染の兆候ではありません。
2. 「安全ではないページ」には接続していない
今回の操作は、警告画面で止まっただけなので、遷移先のサーバーとの間に通信は成立していません。
「続ける」を押さず、個人情報やパスワード、クレジットカード情報を入力せず、アプリや構成プロファイルのインストールも通知の許可もしていなければ、問題ありません1。
そのまま「戻る」または「閉じる」操作をすれば大丈夫です。
今回の一連の操作には、「Google検索結果→Googleのリダイレクト処理→HTTPサイトへの接続試行→Safariの警告インタースティシャル」という流れで、少なくとも3〜4段階のステップが履歴に積まれていた可能性があります。
2.1. 「この接続は安全ではありません」は通常のWebページではありません
Safariの「この接続は安全ではありません」警告画面は、「インタースティシャル画面」といいます。
「インタースティシャル(interstitial)」とは、「中間の」「すき間の」という意味で、ウェブサーバーとの通信が完了する前に、ブラウザ側の判断で割り込んで表示されます。
通常のWebページは、サーバーからHTMLのデータを受け取って、その情報をブラウザが描画・表示します。
セキュリティ保護されたサイトの場合、TLSというプロトコルで通信を暗号化します2。
このとき、Safariはウェブサーバーと接続開始を試みたとき、証明書が無効だと、通信をその場で止めます3。
この「止めた状態」で表示するのが、「インタースティシャル画面」です。
まだ、遷移先のページは実際にはまだ読み込まれていません4。。
ちょうど、ウェブサイトの入口でノックして、不審に思って止まったようなもので、まだ中に入っていません。
3. セッション履歴上の「中間状態」
これがなぜ重要かというと、「セッション履歴」上の扱いが通常のページとは異なるからです。
Safari下部にある「←(戻る)」は、「セッション履歴」を1段階戻る操作です5。
通常のページ移動だけでなく、途中の状態が残っていることがあります。
今回のSafariの警告画面は、AとBの間に挟まる中間状態として記録されます。
なので、警告画面から「戻る」を押すと、直前の検索ページに戻れないことがあるのです。
このためインタースティシャル画面の中には「戻る」ボタンがついています。
これは、中間状態でも前の画面に戻れるように設計された専用の操作です。
3.1. Google検索のタップから表示まで、履歴に何が積まれるか
ただし、この「戻る」でも、一回で戻れないことがあります。
ユーザーからは「リンクを1回タップしただけ」に見えても、セッション履歴の内部では複数の状態が作られていることがあるからです。
たとえば、Googleはページの有用性やアクセス数などを計測するため、検索結果のURLに直接飛ばすのではなく、Googleのサーバーを一度経由するリダイレクト処理を挟むことがあります。
このリダイレクト自体が履歴に1エントリ追加されます。
Googleの検索結果ページは、「SPA」に近い、ページ遷移を見かけ上に保ちながら内部でコンテンツを動的に切り替える構造を持っています。
「SPA」とはシングルページアプリケーションの略で、History APIのpushState()やreplaceState()という機能で、ブラウザの履歴エントリを追加・書き換えします6。
そのため、ユーザーからは「検索結果を1回タップしただけ」に見えても、セッション履歴上には複数のエントリが積まれていることがあります。
つまり、Safariで「戻る」を1回押しても検索結果に戻らないのは、どこか中間の状態に戻ったためです。
3.2. Safariのbfcache
さらに、Safariには戻る・進む操作を高速化するための「bfcache(Back/Forward Cache)」という仕組みがあります。
ページ全体の状態をメモリに保存し、戻るときに復元するので、戻ったページは再読み込みが発生しません。
そのため、「戻った瞬間の見た目」と「実際の履歴の状態」がずれて感じることがあります7。
4. 挙動の原因は3つ重なっている
「戻る矢印で一発で戻れなかった」のは、次の3つが重なった結果です。
Safariの警告画面は通常のWebページではなく、専用の「戻る」ボタンを持つ中間状態として履歴に挿入されます。
Google検索からリンクを開く過程ではリダイレクトやHistory APIによって履歴エントリが複数積まれます。
bfcacheによる高速復元が、履歴の実態とユーザーの感覚をずらします。
Safariが警告を出した時点でページの読み込みは止まっており、遷移先との通信は始まっていません。
警告画面内の「戻る」ボタンを使えば、確実に前のページへ戻れます。
- Appleのサポートページでは、Safariが「安全でない」と警告するケースとして、暗号化されていないHTTPサイトや、証明書に問題があるサイトへのアクセスを挙げています。この警告は「開いただけで感染した」という意味ではなく、「この先で入力する情報が保護されない可能性がある」という通知です。 – If you see a ‘Not Secure’ warning while browsing with Safari – Apple Support
- TLSはTransport Layer Securityの略。ネットワーク越しにアプリケーションが安全に通信するためのプロトコルで、第三者による傍受や改ざんを防ぎます。現代のブラウザはすべてTLSに対応しており、サーバーが有効なデジタル証明書を提示することを接続の条件としています。 – Transport Layer Security (TLS) – MDN Web Docs
- TLSハンドシェイクでは、ブラウザとサーバーが使用するTLSのバージョンと暗号方式を合意し、サーバーのSSL証明書を検証したうえで、セッションキーを生成して安全な通信路を確立します。 – What Happens in a TLS Handshake? – Cloudflare
- AppleはiPhoneのSafariにおいて、HTTPを使用しているWebサイトを閲覧しようとしたときに警告を表示する仕様を公式に説明しています。HTTPはSafariとの通信を安全な接続として提供しないため、このような警告が出ます。 – iPhoneでHTTPを使用しているWebサイトを閲覧したときに警告が表示される – Apple サポート
- ブラウザの戻るボタンはHistory APIのback()メソッドと同じ効果を持ち、セッション履歴内の1つ前のページへ移動します。セッション履歴には通常のページ遷移だけでなく、リダイレクトや警告インタースティシャルも含まれる場合があります。 – History: back() method – MDN Web Docs
- pushState()は新しい履歴エントリを追加し、replaceState()は現在の履歴エントリを書き換えます。どちらも実際のページ遷移を発生させずに履歴を操作できるため、SPAでは頻繁に使われます。 – Working with the History API – MDN Web Docs
- bfcacheはBack/Forward Cacheの略で、ページのスナップショットをメモリに保存し、戻る・進む操作を高速化します。復元時には再読み込みが発生しないため、pageshow/pagehideイベントの扱いなど、通常のナビゲーションと挙動が異なる点があります。 – Back/forward cache – web.dev