1

ユーザーの資格情報を保持するセキュリティ サービスを PHP で構築することを検討しています。その中で最も重要なのは、ログインしているユーザーのトークンです。このサービスは、ある種の API (REST、SOAP など) から別の API によってアクセスされます (外部ユーザーは、別の API の資格情報をチェックする Web サイト API を介して接続します。これは現在検討中のものです)。

トークン (およびその他の情報) を RDBMS に格納する可能性があります。しかし、この解決策は私にはきれいに思えません (トークンは既に期限切れになっていてもデータベースに残ります。期限切れのセッションをクリアするためのメカニズムを実装する必要があるなど)。ネイティブの PHP セッション管理 ( ) を使用することを考えてい$_SESSIONました。それは可能ですか?誰もそのようなことをした経験がありますか?

以下の問題を考えました。

  • PHP ベースの Web サイトが www サーバーに配置されている場合、ユーザーはブラウザー経由で URL にアクセスし、ブラウザーの Cookie を使用してネイティブ セッションが作成されます。セキュリティ API に接続する Web ページ API が 1 つある場合、セッション オブジェクトは常に 1 つだけでしょうか? 設定可能ですか?
  • セッションはどの程度正確に作成され、どのようにメカニズムに影響を与えることができますか (たとえば、Cookie に基づいていないなど)?
4

1 に答える 1

1

私のアドバイスは、データベースを使用することです。

セッションの一般的な概念を説明することから始めましょう。セッションは、サーバー側の Cookie と見なすことができます。$_SESSION 変数ストレージの場所は、PHP の session.save_path 構成によって決まります。通常、これは Linux/Unix システムでは /tmp です。セッションには、関連付けられたクライアントのセッション パラメータがあります。session_start またはそのようなものが発行されると、サーバーはクライアントから提供されたセッションパラメーターに基づいてファイル/セッションを取得します。これらは単に保存されたファイルであるため、サーバーが他のクライアントのセッションを読み取ることができます。

それはあなたが説明する2番目の問題に私をもたらします。私が正しければ、ユーザーのセッションに関する API 要求情報が必要です。最初の段落に基づいて、セッションの目的は、セッションをある種のグローバル ストレージとして使用することではないことを理解していただければ幸いです。もちろん可能です。外部 API に session-parameter を含めたり、session-file を手動で読み取ったりすることもできますが、私にはこれらは汚い修正のように思えます。それは、セッションが構築される目的ではありません。

セッションの使用に惹きつけられる他の唯一のものは、セッションの自動タイムアウトです。ただし、この単純なロジックは、データベースを使用するときに簡単に実装できます。あなたがすべきことは、データベースにユーザーの最後のアクティビティの時間を登録することです. API がユーザーのデータを要求すると、現在の時刻 (最後のアクティブな時刻) が特定のしきい値よりも低いかどうかを簡単に確認できます。そうでない場合、セッションは期限切れになり、同時にテーブルからセッションを削除できます。これは、セッションが内部的に使用するのとほぼ同じ一般的な方法であり、セッションを削除するために通常の cron ジョブを必要としません (ただし、データベースをクリーンアップするのには役立ちます)。

したがって、データベースを使用してデータを保存することを恐れないでください。データベースは、まさにそのように構築 (および最適化) されているからです。

于 2013-07-01T09:37:59.227 に答える