こんにちは。
本日は、最近お問い合わせをいただくことの多い気のする、何かと話題の Cookie についてのお話です。
とはいっても、SameSite の話ではないです。
Internet Explorer をご利用の際に良く陥りがちな問題についてお話しします。
Cookie が送信されない!
単一のドメイン、ホストのみで遷移するような仕組みの Web サイトでは問題となることはないですが、最近の Web サイトでは複数のサービスと連携をとるような複雑な構成をしていることが多くなってきました。
このように、異なるドメイン、ホスト間を行き来するような仕組みの Web サイトの場合、まれに Cookie が送信されない!という事象に出くわすことがあります。
これによって、例えば「認証したはずなのに最初のページに戻っちゃう」や「Cookie に情報を保存したはずなのに保存されていない」といった事象が発生する場合があります。
しかも、、、Microsoft Edge や Google Chrome では問題ないのに Internet Explorer だけで起きる…という状況となると、いよいよ「なんで?」という状況となります。
Internet Explorer オリジナルの機能の影響
Internet Explorer オリジナルの機能として、「保護モード」という機能があります。
保護モードの詳細については こちら を参照いただきたいですが、Windows Vista 上の Internet Explorer 7 で初めて搭載された Internet Explorer のセキュリティ機能の一つです。
どうしてこの機能が Cookie の送信に影響するのか
答えは、保護モードの違い による Cookie の取り扱いが影響します。
具体的には、保護モードの有効 / 無効による Cookie の保存先の違いが影響します。
Cookie は下記のいずれかの方法で発行/作成されますが、これら以外にブラウザーが勝手に Cookie を作成することはありません。
- Set-Cookie ヘッダー
- document.cookie プロパティ
ファイルに保存される形式の Cookie (expires 属性や maxage 属性が指定された Cookie) は、Internet Explorer では保護モードの状態に合わせて インターネット一時ファイル と同様に Cookie も保存先が異なります。
- 保護モード無効時 : %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies
- 保護モード有効時 : %USERPROFILE%\AppData\Local\Microsoft\Windows\INetCookies\Low
それぞれの Cookie は独立して存在しており、例えば、保護モードが「無効」な時に保存された Cookie は、保護モードが「有効」な時には利用されません。
対象の Cookie がどの Web サイトを閲覧したときに発行されて、どの Web サイトで対象の Cookie を利用しようとしているのか、そしてそれぞれの Web サイトの保護モードの状態がどうなっているか、という点がとても重要です。
Cookie が送信されない一例
例えば、Azure AD (AAD) 認証を必要とする Web アプリケーションを例とした場合のことを考えましょう。
なお、下記を前提とします。
- login.microsoftonline.com は信頼済みサイト ゾーンに明示的に登録されている
- 対象の Web アプリケーションは明示的なゾーン登録をしておらず、インターネット ゾーンと判断される
- インターネット ゾーンは保護モード有効、信頼済みサイト ゾーンは保護モード無効として構成している
- 最初に login.microsoftonline.com へ接続し AAD 認証が行われます。
- 認証に成功すると認証済みを示す Cookie が AAD から発行されます。
login.microsoftonline.com は 信頼済みサイト ゾーン として認識されるため、発行された Cookie は保護モードが無効な場合の保存先に保存されます。 - Web アプリケーションにリダイレクトされトップ ページが表示されます。
Web アプリケーションは、インターネット ゾーン として認識されるため、Cookie は保護モードが有効な場合の保存先が参照されます。 - Web アプリケーションのトップ ページでは、処理に必要なトークンを取得するため、バックグラウンドで XMLHttpRequest を使って login.microsoftonline.com へリクエストを送信します。
Web アプリケーションは保護モードが有効な状態となっているため、XMLHttpRequest によるリクエストもこの制約を受けます。
Cookie の参照先は保護モードが有効な場合の保存先となり、2. で保存した Cookie は参照されず「認証済みを示す Cookie がリクエストに含まれない」動作となります。 - login.microsoftonline.com から、対象ユーザーがログオンしていないとのレスポンスが返されます。
- Web アプリケーションの実装により再度ログインを促す表示が行われます。
対処策について
このような状況を避けるにはどうしたらよいでしょうか。
端的には、関連する Web サイトの セキュリティ ゾーンを統一する こと、です。
言い換えると、関連するすべての web サイトを、例えば、信頼済みサイト ゾーン に明示的に追加します。
単一のドメイン、ホストのみで運用していた場合には、特定のドメイン、ホストのみを登録すれば良かったのですが、今は様々なサービスと連携して Web サイトが構築されていることが多々あります。
このため、Web サイト閲覧時にどうも動きがおかしい…といった状況に遭遇した場合には、まずは、保護モードの状態をすべてのセキュリティ ゾーンで統一してみてどうかを確認してみましょう。
すべてのゾーンで保護モードを有効にすることで事象が改善するようであれば、今回お話しした Cookie の動作が影響している可能性があります。
この場合は、保護モードの状態をもとに戻したうえで、上述のとおり、関連する Web サイトをすべて 信頼済みサイト ゾーン などに明示的に登録して事象が改善するかどうか確認してみましょう。
今回は以上です。
それでは、また次回!
なお、本ブログは弊社の公式見解ではなく、予告なく変更される場合があります。
もし公式な見解が必要な場合は、弊社ドキュメント (https://docs.microsoft.com/ や https://support.microsoft.com) をご参照いただく、もしくは私共サポートまでお問い合わせください。