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


77

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

認証CookieはRESTの哲学と互換性がありますか?


正確な複製安らかな認証


1
私の理解@JarrodRobersonここでの複製として別のサイト上の答えは質問を修飾しないことだった
トム・スクワイアーズ

5
@JarrodRobersonは、各サイトのFAQに基づいて、質問がこのサイトに属し、Stack Overflowに属さないと主張します。RESTfulアーキテクチャのこの側面に関する設計方法論/哲学およびトレードオフに興味があります。スタックオーバーフローは実装に関する質問を対象としています。このサイトでは、設計方法論とトレードオフについて詳しく説明しています。
ブランドンリントン

1
ここで@BrandonLintonに同意します。質問はStackoverflowには広すぎます。それはアーキテクチャと設計方法論に関するものです。OPは、特定の答えではなく、ベストプラクティスとパターン、提案、および落とし穴を求めているため、言語は指定されていません。したがって、ここに属します。
dooburt

回答:


81

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

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

だから、APIは、最初に見えるかもしれませんAuthorizationそれはおそらく、ブラウザ以外のクライアントはそれを置くことを好むだろうが、ブラウザベースのクライアントを簡素化し、合理化するための場所だから、それはかもしれない、それが必要とする認証データのヘッダセッションクッキーをチェックサーバー側ログインの場合。ただし、通常のAuthorizationヘッダーが欠落している場合のみ。

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

編集: REで以下の@Konradのコメントに:

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

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

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


4
+ 1、Authorizationヘッダーを使用する実用性は間違いなく気に入っていますが、クライアントに最適な方法に応じてCookieに「フォールバック」します。
ブランドンリントン

「ブラウザ以外のクライアントにとって、Cookieの管理は非常に大きな不便です...」に同意しません。ほとんどのHTTPクライアントライブラリはCookieをサポートしHttpClientています。たとえば、.NETでは、Cookieを問題なく使用でき、実際に考える必要はありません。トークンを比較すると、特にどこかに保存しないとトークンを簡単に無効にできないため、実装が難しくなります。
コンラッド

1
@Konradは、一部の非ブラウザークライアントで簡単だからといって、すべてのクライアントで簡単だというわけではありません。使用する特定のクライアントのみをサポートする必要がある場合は問題ありませんが、私はこの質問を公開APIに関するものであると解釈しました。中curlwget、クッキーを管理することはかなりくそ不便であり、あなたは本当にたくさんそれらについて考える必要があります。私は私の答えを編集することであなたの他のポイントに答えました。
SingleNegationElimination

Cookieを受け入れるだけでCSRFの脆弱性が開くことに注意してください。security.stackexchange.com/a/166798
Michael Osl

14

はいおよびいいえ-使用方法に依存します。

クッキーは、クライアントで、クライアントのために、クライアントのクライアントの状態を維持するために使用され、クライアントによって安静になります。

サーバーの状態をCookieに保存している場合、基本的にはクライアントに負荷を移しているだけです-これは安静ではありません。

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

安らかな:

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

落ち着かない:

  • セッション情報の保存

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


10
クライアントに「isLoggedIn」フラグを保存する場合、認証をまったく使用しないこともできます。
tdammers

これは間違いなく理にかなっています-クライアント側のアプリケーション状態の保存はRESTと一貫していませんが、それ自体を表すために使用するクライアント情報は問題ないようです。
ブランドンリントン

1
Cookieに認証情報を入れると、クロスサイトリクエストフォージェリ攻撃の可能性が残ることを付け加えます。より良い方法があります。Amazonを
Vandermeer

@tdammers「isLoggedIn」フラグがJWTにある場合はどうでしょうか?次に、JWTが適切に発行および検証されることを条件に、これは安全でなければなりません。
アーロンJスペトナー


12

Cookieを使用できます。RESTはそれらを許可します。

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

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

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