Webアプリケーションはステートレスである必要があります
ナンセンス。Web 要求はステートレスである必要があります。より正確には、Webリクエストはステートレスです。
しかし、アプリケーション全体がステートレスであるべきだと言うのは、まったくナンセンスです。
各リクエストは独立したトランザクションとして扱われます。
はい、正確に。またはより正確に、はい、必然的に。HTTPでは、各リクエストは本質的に他のすべてのリクエストから独立しています。HTTPに「ステートフルネス」を追加するには、「ステートフル」リクエストごとに「ステート」を明示的に識別、保存、取得する必要があります。そして、これには手間がかかり、パフォーマンスが低下し、複雑さが増します。
そして、これらの理由により、ステートレスである可能性のある各リクエストはステートレスである必要があります。
そのため、セッションとCookieは両方ともステートフルであるため、回避する必要があります。より良いアプローチは、トークンを使用することです
いくつかのこと:トークンはセッションストレージにも結び付けることができます。Cookie をセッションストレージに関連付ける必要はありません。トークンはしばしばクッキーに保存されます。また、セッションは単に仕事に適したツールであることがあります。
つまり、少なくとも時々、セッションとCookieはトークンと同じくらい「良い」ということです!
サーバーに何も保存されていないため、[トークン]はステートレスです。
まあ、それだけです。それが、「無国籍」という教義の本当の意味です。明確にするために、それはサーバーに「何も」を格納することではなく、サーバーにセッション状態を格納しないことです。
たとえば、Gmailの受信トレイは状態です。そして、サーバーに保存する方が良いでしょう!しかし、それはセッション状態ではありません。
したがって、小さな識別子を取得して自分が誰であるかなどを把握できるサーバーを使用する代わりに、ステートレスアプリケーションは、すべての血なまぐさい要求で自分が誰であり、何をしているのかを思い出させたいと思います。アプリケーションの状態はまだ存在し、クライアントはそれを保持する責任があります。
今、その状態が小さい場合、おそらく大丈夫です。場合によっては非常に良いです。
そして、もちろん、ステートフルになることを単に期待するものがあります...
セッションのために保持されているデータ(ショッピングカート内のアイテムなど)がある場合、Webアプリケーションはどのようにステートレスになりますか?これらは実際にどこかにデータベースに保存され、その後定期的にパージされますか?
2つのオプション。セッションがあるか、拒否されています!
...しかし、真剣に。通常、カートをCookieに保存することはありません。ショッピングカートのようなものは、「従来の」セッションに格納されるCart
か、サーバーが後続のリクエストにプルするために使用する何らかのIDを持つオブジェクトとして格納されます。.. uhh ... ... err ... セッションのようなもの。
真剣に言うと、2つの通信エージェントが会話内のメッセージをコンテキスト化できる場合、「ステートフルネス」と呼ばれるものはかなりの程度になります。そして、従来から理解されているセッションは、これが発生するメカニズムと呼ばれるものです。
トークンを使用するか「セッション」を使用するかに関係なく、サーバーが処理するリクエストごとに、リクエストを処理するためにそのリクエストをコンテキスト化する必要があるか、しないかを主張します。コンテキストが不要な場合は、フェッチしないでください。コンテキストが必要な場合は、近くに置いた方が良いでしょう!
そして、関連する質問として、主要なWebサイト(Amazon、Google、Facebook、Twitterなど)は実際には無国籍ですか?トークンまたはCookie(または両方)を使用していますか?
おそらく両方。しかし、一般的に言えば、彼らはまさにあなたがすることをします:彼らは大規模な「セッション」データベースの「状態」レコードを識別するためにクッキーを設定します。
可能であれば、集中ストレージでの不必要な競合を避けるために、基本的なIDクレームを短命の「トークン」に押し込むと思われます。しかし、これらのサービスの多くが「他のすべての場所からログアウトする」ことを許可しているという事実は、トークンを使用している場合、少なくとも半伝統的なセッションモデルによって「サポート」されていることを示す良い指標です。 。