フロントエンドとバックエンドが分離された開発モデルでは、クロスドメインリクエストが一般的なシナリオになっています。ただし、ブラウザの同一オリジン ポリシーの制限により、クロスドメイン アクセス中にセッションを共有することはできず、その結果、異なるドメイン名間でユーザーのログイン ステータスを維持できなくなります。セッションのクロスドメイン共有を実現するには、Cookie またはトークンを使用してセッションを処理します。
Cookie は特定の条件下でドメイン間で転送できるため、一般的なセッション共有ソリューションとなります。実装手順は次のとおりです。
最初のステップは、サーバー側でセッションを作成することです。
session_start();
$_SESSION['user'] = 'example';
2 番目のステップは、セッション ID を Cookie に書き込み、Cookie スコープを設定することです。
setcookie(session_name(), session_id(), time() + 60*60*24*30, '/', 'www.example.com', false, true);
このうち、 www.example.com は実際のドメイン名に合わせて変更する必要があります。
3 番目のステップは、フロントエンドでクロスドメインリクエストを行うときに Cookie を送信することです。
fetch('http://www.example.com/api', {
credentials: 'include',
});
資格情報: ここでの「include」は、ブラウザーがリクエストで Cookie 情報を送信することを保証するために使用されます。
4 番目のステップでは、サーバーがリクエストを受信し、Cookie 内のセッションを解析します。
session_id($_COOKIE[session_name()]);
session_start();
if(isset($_SESSION['user'])){
// session クロスドメイン共有が成功しました
}else{
// session クロスドメイン共有に失敗しました
}
以上の構成により、クロスドメイン環境でセッション情報を共有することが可能になります。
もう 1 つのより柔軟なソリューションは、トークン メカニズムを使用してクロスドメインのセッション共有を実現することです。この方法は Cookie に依存しないため、API インターフェイスまたはモバイル端末のシナリオにより適しています。
実装手順は次のとおりです。
最初のステップは、ユーザーのログイン時にサーバー上でトークンを生成することです。
$token = bin2hex(random_bytes(16));
// 意思tokenデータベースに保存してユーザーにバインドする
// 戻るtokenクライアントへ
2 番目のステップでは、フロントエンドがトークンをlocalStorageまたはsessionStorageに保存します。
3 番目のステップは、クロスドメイン リクエストを行うときにリクエスト ヘッダーまたはパラメータにトークンを追加し、サーバーに送信することです。
fetch('http://api.example.com/userinfo', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
});
4 番目のステップでは、サーバーはトークンを解析することでユーザーの ID を検証し、検証結果に基づいてセッション状態を復元します。
トークン ソリューションを使用する場合は、セキュリティの問題に注意する必要があります。トークンには有効期間が必要で、リフレッシュ メカニズムを通じて定期的に更新できます。また、セキュリティ リスクを防ぐために、サーバーは期限切れのトークンを定期的にクリーンアップする必要があります。
この記事では、2 つの一般的な PHP セッションのクロスドメイン共有ソリューションを紹介します。Cookie によるセッションの共有と、トークン メカニズムによるセッション検証の実現です。前者は実装が簡単で、同じメイン ドメイン内のサブドメイン間での共有に適しています。後者はより柔軟で安全であり、複雑な分散システムまたは複数端末システムに適しています。開発者は、プロジェクトのアーキテクチャとセキュリティ要件に基づいて、適切な実装方法を選択できます。