RESTful APIにおけるセッションの役割と、Roy Fieldingの見解について

RESTfulとは

REST(Representational State Transfer)は、Webサービスのアーキテクチャスタイルの1つで、HTTPプロトコルを使用してリソースの状態を表現します。

RESTfulが生まれた背景

RESTは、2000年にロイ・フィールディングによって提唱されたWebサービスのアーキテクチャスタイルです。
フィールディングは、カリフォルニア大学アーバイン校(University of California, Irvine)
Doctor of Philosophy(博士号の一つ)を取得した後HTTPプロトコルの設計に深く関わりHTTP 1.1の共著者の1人でもあります。

当時、Webアプリケーションは、SOAPXML-RPCといったRPC(Remote Procedure Call)ベースのプロトコルを使用して構築されることが一般的でした。
これらのプロトコルはWebサービスの開発において非常に複雑!、リソース指向のアプローチには適していませんでした。

フィールディングは、Webサービスを構築するためにHTTPの持つリソース指向の特性を活用することを提唱しました。
彼は、HTTPの4つのメソッド(GET、POST、PUT、DELETE)を使用して、リソースの表現を操作することができるアーキテクチャスタイルを定義しました。
また、リソース指向のアプローチにより、RESTfulなWebサービスはよりシンプルで拡張性が高くなると主張しました。

この提案はWebサービスの世界に革命をもたらしRESTful APIは現在でも最も一般的なAPIスタイルの1つとして広く使用されています。

RESTfulとHTTPメソッド

RESTful APIを設計するためには、HTTPメソッドの役割を理解する必要があります。

RESTful APIでよく使用されるHTTPメソッドとその役割の概要です。

  1. GETメソッド
    GETメソッドは指定されたリソースの表現を取得するために使用されます。
    サーバーからデータを取得するために最も一般的なメソッドでありリソースの識別子をURLに含めます。
    例えばブログ記事を取得するためにはGETメソッドを使用します。
  2. POSTメソッド
    POSTメソッドは指定されたURIに新しいリソースを作成するために使用されます。
    リクエスト本文に作成するリソースの情報を含めます。
    例えば新しいブログ記事を投稿するためにはPOSTメソッドを使用します。
  3. PUTメソッド
    PUTメソッドはURIで指定されたリソースを更新するために使用されます。
    リクエスト本文に更新するリソースの情報を含めます。
    例えば、既存のブログ記事を更新するためには、PUTメソッドを使用します。
  4. DELETEメソッド
    DELETEメソッドは、URIで指定されたリソースを削除するために使用されます。
    例えば既存のブログ記事を削除するためには、DELETEメソッドを使用します。
  5. PATCHメソッド
    PATCHメソッドは指定されたURIで指定されたリソースの一部を更新するために使用されます。
    リクエスト本文に更新するリソースの一部の情報を含めます。
    例えば既存のブログ記事の一部を更新するためにはPATCHメソッドを使用します。

HTTPメソッドは、RESTful APIを設計するために非常に重要であり、適切なHTTPメソッドを使用することで、APIをよりシンプルかつ柔軟にすることができます。

セキュリティはどうなの?

RESTful APIにおける認証・認可は、一般的にHTTPプロトコルの標準的な認証方式を使用します。

以下に代表的な認証方式をいくつか紹介します。

  1. ベーシック認証
    HTTPリクエストヘッダーにユーザ名とパスワードをBase64でエンコードして渡す方法です。
    ただし、Base64は暗号化ではなくエンコードなのでパスワードが平文のままで送信されるため安全性が低いという問題があります。
  2. OAuth 2.0
    OAuth 2.0は、アクセストークンを介して認証を行います。
    ユーザーは、認証を行うアプリケーションに対してアクセストークンを発行することでAPIを利用することができます。
    アクセストークンは有効期限があり期限が切れた場合には再度認証を行う必要があります。
  3. JSON Web Token (JWT) JWTは、JSONで表現されたトークンで、認証を行うために使用されます。
    JWTには、署名されたデータが含まれており署名を検証することでトークンが正当であることを確認します。

セッションの扱いってどうなってるの?

例えばオンラインで買い物するときにカートに入れますよね?

だいたいの場合、現代では「セッション」を使うのですが
Restfulだと表現できるのでしょうか?

RESTful APIは、状態を保持しないステートレスなアーキテクチャなのです。
そのため、セッションをサーバー側で維持することは原則的にはありません

代わりに、RESTful APIはリクエストごとに認証情報やトークンを送信することでセッションを表現します。
これによりクライアントが状態を維持しながら複数のリクエストを行うことができます。

ただし、一部のRESTful APIでは、一時的なセッション情報をサーバー側に保存する必要がある場合があります。
たとえば一時的なキャッシュやログイン認証などが該当します。
この場合、RESTful APIは通常のWebアプリケーションと同様にセッションIDをクライアントに発行しそのセッションIDを用いてセッションを管理することがあります。

セッションをサーバー側で維持する場合にはスケーラビリティに注意する必要があります。
セッション情報をサーバー側で管理するとサーバー側の負荷が増大しスケールアップが困難になる可能性があります。

そして、フィールディング(ろい?)さんははRESTful APIにおいて状態を保持するセッションの使用を推奨していません

以下のように述べているようです。

RESTfulなシステムは状態を保持しないので、セッションの使用は不必要です。クライアントは、必要に応じてサーバーに対して状態情報を送信することで、セッションをシミュレートできます。

つまり、RESTful APIではセッションを維持せず、代わりにクライアントが必要な状態情報をリクエスト毎に送信することで、状態を表現するという考え方を提唱しています。
これは、RESTful APIの設計原則の一つであるステートレス性を維持するためのアプローチです。