web-dev-qa-db-ja.com

RESTful APIでCookieを使用する必要がありますか?

ユーザーがWeb APIで承認/認証された操作を実行する方法に特に興味があります。

REST哲学と互換性のある認証Cookie、およびその理由は?

88
Brandon Linton

理想的なReSTfulサービスでは、クライアント(ブラウザーにない場合があります)が必要なタスクを1つの要求で実行できます;そのために必要な完全な状態はサーバーではなくクライアントによって保持されるためです。クライアントは状態を完全に制御できるため、それ自体で状態を作成でき(正当な場合)、APIと通信して「完了」するだけです。

クッキーを要求することはそれを難し​​くすることができます。ブラウザ以外のクライアントの場合、Cookieの管理は、クエリパラメータ、プレーンなリクエストヘッダー、またはリクエストボディに比べてかなり大きな不便です。一方、ブラウザでは、Cookieを使用すると、多くのことがより簡単になります。

したがって、APIは最初に、必要な認証データのAuthorizationヘッダーを調べます。これはおそらく、非ブラウザークライアントがそれを配置することを好む場所だからですが、ブラウザーベースのクライアントを簡素化および合理化するために、 また、サーバー側ログインのセッションCookieを確認しますが、通常のAuthorizationヘッダーが欠落している場合のみです。

別の例として、通常は多くのパラメータセットを必要とする複雑なリクエストが挙げられます。非対話型クライアントは、すべてのデータを1つの要求にまとめるのに問題はありませんが、HTMLフォームベースのインターフェイスでは、要求が複数のページ(「ウィザード」ページのセットなど)に分割され、ユーザーが表示されない場合があります。以前の選択に基づいて適用できないオプションがあります。すべての中間ページがクライアント側のCookieに値を格納できるため、ユーザーが実際に要求を送信する最後のページのみがサーバー側に影響を及ぼします。 APIは、リクエストの本文で必要な属性を検索し、必要なパラメーターがそこにない場合はCookieの検索にフォールバックできます。

編集:REの@Konradのコメントへのコメント:

トークンはどこかに保存しないとトークンを簡単に無効にすることができないため、比較するとトークンの実装はより困難です。

ええと...あなたはサーバー側でクッキーを検証していますよね?ブラウザが24時間後にCookieを破棄するように言ったからといって、必ずしもCookieを破棄するわけではありません。そのCookieは、高度な技術を持つユーザーによって保存され、「有効期限が切れた」後もずっと再利用できます。

サーバー側にセッションデータを保存したくない場合は、トークン(Cookieなど)に保存する必要があります。自己完結型の認証トークンは Macaroon。 と呼ばれることがあります。これがクライアントとサーバーの間でどのように渡されるか(Cookieによって、追加のヘッダーとして、または要求エンティティ自体で)、認証メカニズム自体から完全に独立しています。 。

はい、いいえ-使い方によって異なります。

Cookieは、クライアントで、クライアントのクライアントの状態を維持するために使用される場合、およびクライアントによって使用される場合、安静です。

サーバーの状態をCookieに保存している場合、基本的には負荷をクライアントにシフトしているだけです。

それでは、いくつかの例は何ですか?

落ち着いた:

  • 認証の詳細または「ログイン済み」のようなもの
  • 最後に表示したページまたはアプリケーション内の場所など。

落ち着かない:

  • セッション情報の保存

安らぎはサーバーの無国籍に由来します。クライアントはアプリケーションの状態を維持し、それをサーバーに送信して現在の場所を伝え、サーバーがそこからどこへ行くかを決定できるようにします。基本的にセッション/状態は履歴データを必要とし、いわば過去のリクエストに依存しているので、いわば休息アプリケーションは理想的ではありません(ログイン画面を表示する場合、100%純粋な休息アプリケーションを実行することは現実的ではありません:)

16
PhD

クッキーを使用できます。 REST許可します。

RESTでは、すべてのセッション情報をクライアント側に保存する必要がありますが、認証に関しては、セキュリティ上の理由から一部の情報をサーバー側に残す必要があります。

私のブログの1つ posts から、認証データはRESTに関して範囲外と見なされるという一般的な合意があります。したがって、サーバーがこのセッションデータの一部を保持することは問題ありません。

15