サーバー側セッションはRESTに違反しますか?


14

Roy Fielding(HTTP仕様の主要著者の1人)によると、RESTについて議論する際に、彼の独創的な論文Architectural Stylesで次のように言及しています。

[E]クライアントからサーバーへの各リクエストには、リクエストを理解するために必要なすべての情報が含まれている必要があり、サーバーに保存されているコンテキストを利用することはできません。

「保存されたコンテキスト」とは、次のページのページ番号が何であるかなどのアプリケーションの状態と、データストア、イメージなどのリソースの状態を指します。

純粋な休憩(上記の論文に準拠する実装として定義されている)のほとんどの試みは、サーバー上のセッションデータの保存に依存しているために失敗しなければならない(永続的またはその他)と言っても過言ではありませんか?

セッションの概念は、特にWeb開発者にとっては一般的ですが、上記の定義に従ってRESTfulですか?


2
その定義によれば、実際には安らかなものは何もないと言いますが、その定義は合理的にも理にかなっていますか?「restful」なGoogle検索を想像してください。Googleがあなたを検索するために、Googleへのリクエストでインターネットのインデックスを提供する必要があります。何?いいえ、永続ストアを使用できず、安らかであると言うことは、安らかなインターフェースが実際に無意味であると言うことに等しいでしょう。それは、我々はすべてのメモリ内のセッションを維持し、それは...まだ良い休息のデザインだと言って開始すべきであるという意味ではありません
ジミー・ホッファ

3
アプリケーションの状態リソースの状態には違いがあることに注意する必要があると思います(Googleインデックスはリソースの状態になり、完全に合法です)。質問でそれをもっと明確にすべきです。
マット

そのような区別はありますか?定義してください。:)私は人々がこれらを以前に定義しようとするのを見たことがありますが、実際には違いがないので、本当にあいまいになります。それらは両方とも可変データであり、状態のある形式と別の形式との関連する唯一の違いは、それが永続的であるかどうかであり、非形式は通常再生可能であることを意味し、それが違います。
ジミー・ホッファ

1
私はこれを自分で考えました。私のアプリケーションが金の「安らかな」星を必要とする理由を誰も説明したことがないので、私はそれについて本当に心配しません。
PSR

回答:


10

はい、セッション状態によってRESTfulアプリが非RESTfulになります。些細な例として、妹はWall Street Journalを購読しています。定期的に彼女はペイウォールの背後にある何かを読んで、WSJアカウントを持っていない友人に(WSJ経由ではなく自分のメールクライアント経由で)リンクを送信することにします。クリック、送信、失敗。明らかに、そのURLでの妹の経験は友人の経験とは異なります。

関連しますが、厳密にはトピックではありません:私は、ネット上での重要な研究努力をサポートするように設計されたアプリケーションの初期設計段階にいます(クエスト(思考:ステロイドとLSDのブックマーク)と呼ばれます)。クエストの所有者は自分のデータの特定のビューを他の人と共有したいが、このビューにはUIの状態(たとえば、どのデータがどのペインに表示されているか)とUIにアクセスするための適切なアクセス許可の組み合わせが必要表示されるデータ。受信者が目的のビューを取得するには、多くの保存状態が必要です。

私の現在のソリューションは、別のオブジェクトに表示するために必要なUI / ACL /何でも情報のすべてを保存し、用のURL(たぶんUUID)を返すことで、そのオブジェクト。ビューオブジェクトにアクセスすることは、それを所有するすべての人が同じ情報/経験を得るという意味でRESTfulであると考えることができると信じています


1
あなたはしているビュー・オブジェクトの例では、この上の別の角度です。きちんとした。
マット

主に質問に直接回答し、非常に明確な例を示しているため、他の素晴らしい回答にもかかわらず、これを回答として受け入れます。また、ビューオブジェクトの 2番目の部分はスケールを傾けました。
マット

1
wsjサイトが非安穏なアプリの例であると言っているなら、あなたの例がそれを示していることに同意しません。たとえば、WSJサイトが姉妹のクライアントから完全に与えられたデータに依存してデータを提示している場合、@ Mattが定義したRESTfulによるものです。ただし、一時的なメモリ内セッション状態に依存している場合は、定義により、MattがRESTfulではありません。Mattが提供した定義は実装の仕様に基づいているのに対し、RESTは消費テクニックによってより適切に定義されているため、これを指摘するだけです。
ジミー・ホッファ

@JimmyHoffa- RESTの制約に関する私の理解は、それがステートレスであることです。それは私にはかなり明白なようです。
ピーターローウェル

WSJアプリケーションに状態がない場合、表示可能な記事をクライアントから送信する必要があります。この記事はサイト管理者がいつでも編集できますが、間違いなくWSJアプリの状態の一部です。努力している区別は永続的な状態であるため、セッションなどの非永続的な状態よりも保証が多く、管理オーバーヘッドが少ないことに加え、トランザクションのアトミック性制御が単純になると思います。これは、単純な消費モデルとともに、人々が安らぎを求めているものです。(私は思う)
ジミーホッファ

2

サーバー側セッションはRESTに違反しますか?

彼らは間違いなくそうです!RESTを実装するときは、サーバー側のセッションが存在しないようにする必要があります。そうでない場合は、ハイブリッドRPC / RESTソリューションがあります。

クライアントは、新しい要求が行われるたびに、クライアントの認証に必要な情報を含む、要求の処理に必要なすべてのコンテキストをRESTfulサービスに送信する必要があります。サーバーは情報をキャッシュして自由に後続のリクエストを処理できますが、キャッシュされた情報がサーバー側のセッションに達してはなりません。言い換えると、リクエスト自体には、キャッシュされた状態がなくても処理されるのに十分な情報が含まれている必要があります。


1

おそらく、「セッションデータ」の意味に依存します。それは正確な用語ですか?

多くの場合、2者間の安全な通信には、サーバーが時間制限のある「アクセストークン」を生成(および保存)する必要があります。このアクセストークンは、私が「セッションデータ」と呼ぶものです-サーバー側に保存され、時間制限があり、1つのクライアントに関連付けられています(通常、彼のアクセス許可)。

この種の操作が非RESTfulとしてラベル付けされている場合、私は非常に驚くでしょう。OAuthは一例です。

私は専門家ではなく、ここではあまり自信がありません。私は自分の洞察を共有して、それらが役立つことを望んでいます。


1

RESTの最も重要なポイントは、リソースへのURIが常に同じリソースを指すことです。したがって、ユーザーはこのリソースへの参照を渡すことができ、誰もが同じように見えます。これは、Representational State Transfer(REST)と呼ばれます。サーバーが状態を保持し、同じURIに対して異なるリソースを配信する場合、これはもはや純粋なRESTではないと言えます。


ユーザーが同じものを見るとは限りません。アクセスは、1人のユーザーがどれだけ見ることができるかを指示できます。
エリック14

@Erikしかし、ユーザーはリクエストでどれだけ見たいか(Acceptヘッダーの使用を含む)を述べるため、Pucklの答えは当てはまります。
ヨハン14年

1
@Johan私は同じエンドポイントから、異なるユーザーに対して異なるデータを返します。それ以外の場合、ユーザーを認証するポイントは何ですか。
エリック14年

@Erik私もそうします。それでもなお、認証はリソースの状態の範囲外であると考えているため、厳密に言えば、ビューが認証されたユーザーの影響を受けた場合、RESTfulではなくなります。RESTfulバッジが必要な場合は、リソースの複数の「ビュー」を作成する必要があります。アクセスを要求しているユーザーに応じて、一部のビューのみへのアクセスを許可します。/ USERPROFILES / {ユーザID} / publicview、ユーザーが/ USERPROFILES / {ユーザID} / fullprofileと認可友人へのアクセスを取得へのアクセスを得ることができ、公共だから/ USERPROFILES / {ユーザID} / friendsviewへのアクセスを得る
ヨハン・

0

セッションは、基本的にステートレスなRESTfulアプリケーションに状態を追加するために使用されます。正式には、これによりRESTfulアプリケーションはステートフルになりますが、サーバーが状態を保持することで、各リクエスト/レスポンスですべてのデータをやり取りする必要がなくなるため、生活が少し楽になります。

セッション、およびより一般的な状態では、これを回避できます。これにより、パフォーマンス(転送されるデータが少なくなる)およびセキュリティ(改ざんできるデータが少なくなる)でいくつかのプラスの利点があります。

したがって、RESTの定義の一部に公式に違反している一方で、セッション経由で状態を使用しない RESTfulアプリケーションを目にすることめったにありません


同意しません。ブランド、色、サイズでフィルタリングできるショッピングサイトがあります。従来のWeb 1.0 Webサイトは、いくつかのチェックボックス、サーバー側セッション、およびPOSTでこれを処理していました。example.org/shirtsへのリンクを共有したい場合、「Medium」、「Black」、および「Roots」を選択したことは他の人にはわかりません。(これにより、戻るときにwhenい「データを再配置しています」というメッセージが表示されます。)しかし、(たとえば)example.org/shirts/medium-black-rootsへのリンクを共有すると、全員が同じ表現を持ちます。必要なすべての状態情報はURL(または必要に応じてPOST本体にありますが、共有することはできません)。
ジェシーブキャナン

... RESTfulはすべてに適しているとは限りません。架空のアプリケーションリソース指向ですか(ショッピングサイトは確かにそうです!)?おそらく、リソース指向ではない多くの状態を持つRIAに適合しない可能性があります。正直に言うと良い例は考えられません。
ジェシーブキャナン

0

このステートメントが意味するのは、REST APIをホストするアプリケーションサーバーが、何らかの背後のメカニズムによって周囲の状態をリクエストに関連付けないことです。アプリケーションサーバーデータベースサーバーの違いを考慮してください。RESTの制約は、アプリケーションサーバーがステートレスであることです。ただし、アプリケーションサーバーは、Authorizationヘッダーのユーザー/パスワードの組み合わせやUri自体など、要求の一部である情報に基づいて、リソース状態の要求をデータベースサーバーに委任できます。結局、RESTはクライアント/サーバーモデルに基づいています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.