Linked Web Storageプロトコル 1.0

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-lws10-core-20261016/
最新公開バージョン:
https://www.w3.org/TR/lws10-core/
最新の編集者草案:
https://w3c.github.io/lws-protocol/lws10-core/
履歴:
https://www.w3.org/standards/history/lws10-core/
コミット履歴
編集者:
Jesse Wright (オックスフォード大学)
Erich Bremer (ストーニーブルック大学)
フィードバック:
GitHub w3c/lws-protocol (プルリクエスト, 新しい課題, 未解決の課題)

概要

Linked Web Storage Protocol仕様は、アプリケーションに対し、外部に保存されたデータへの安全で許可に基づく アクセスを相互運用可能な方法で提供することを目的とする。

この文書の位置付け

この節は、この 文書の公開時点における位置付けを説明する。現在のW3C 公開物の一覧およびこの技術報告書の最新版は、 W3C標準および草案 インデックスで確認できる。

これは非公式な提案である。

この文書は、Linked Web Storageワーキング グループにより、 勧告 トラックを用いる作業草案として公開された。

作業草案としての公開は、 W3Cおよびそのメンバーによる承認を 意味しない。

これは草案文書であり、いつでも他の文書により更新、置換、または廃止される可能性がある。 この文書を進行中の作業以外のものとして引用することは不適切である。

この文書は、 W3C 特許 ポリシー の下で運営されるグループにより作成された。 W3Cは、このグループの成果物に関連して行われた 特許開示の公開一覧 を管理している。そのページには、 特許を開示するための手順も含まれる。個人が、 必須クレーム を含むとその個人が信じる特許について実際の知識を有する場合、 W3C特許ポリシー第6節 に従ってその情報を開示しなければならない。

この文書は、 2025年8月18日のW3Cプロセス文書 によって管理される。

1. 文書規約

この節は非規範的である。

2. 序論

この仕様は、エージェントのアイデンティティおよび権限に基づいて、クライアントアプリケーションが Web リソースにアクセスして管理できるようにする Linked Web Storage(LWS)プロトコルを定義する。

リソースサーバーがリンクされたリソースの階層を管理し、それらへのアクセスを提供する方法を標準化することで、この プロトコルにより、ユーザーは異なるクライアントアプリケーションを使用して、同じ保存データを操作できる。これらの リンクされたリソースは、対象が配置されている場所を記述するコンテナーおよび包含関係と、 リソース相互の関係を記述するメタデータによって定義される。

このプロトコルは、これらのリソースを作成、読み取り、更新、および削除するための標準操作を定義する。各 リソースは URI によって識別される。クライアントはルートコンテナーからリソース階層をたどり、 サーバー応答で提供されるリンクを通じて、包含されているリソースおよびそれらの関係を検出する。

エージェントのアイデンティティは、Linked Web Storage サーバーの外部に配置できるアイデンティティプロバイダーを通じて確認される。この疎結合により、サーバーが必ずしも認証情報を直接管理する必要はなく、代わりに、 信頼されたアイデンティティ プロバイダーによって発行されたトークンとして、署名付き認証資格情報を受信して検証できる。したがって、ユーザーは、そのサーバー専用の 新規または既存のアカウントを常に必要とすることなく、既存のアイデンティティを準拠サーバーに提示できる。LWS は、たとえば OpenID Connect、SAML 2.0、および自己署名された制御識別子(CID)の仕様で定義されているユーザー認証を使用する。

認可は、要求を行うエージェントがリソースにアクセスする権限、またはそのリソースに対して 操作を実行する権限を持つかどうかを決定する。準拠 LWS サーバーは、各リソースについて、そのリソースが 非公開(すなわち、その所有者のみが利用可能)、制限付き(すなわち、定義された ユーザーの集合が利用可能)、または公開(すなわち、任意のユーザーが利用可能)であるかを決定するリソースマネージャーを指定する。サーバーは、各クライアント要求を処理する際に、 リソースマネージャーによるアクセス決定を適用する。

この仕様は、次の利用者による使用を意図している。

異なる LWS サーバーインスタンスは、それぞれ独自のリンクされたリソース階層を維持する。エージェントは、 同じ識別情報を使用して複数のサーバーをたどることができ、各サーバーのリソースへのアクセスは、 そのサーバーのリソースマネージャーによって付与された権限によって決定される。すべての LWS サーバーインスタンスが あらゆるエージェント識別子をサポートするとは限らない。特定の LWS サーバーインスタンスでは、そのサーバー インスタンスによって管理されるリソースへのアクセスを得るために、特定のアイデンティティプロバイダーを介してエージェントが自身を 識別することを要求する場合がある。

2.1 リソースアクセス

LWSプロトコルは、ある主体が何らかのリソースを何らかのエージェントに利用可能にできる標準的なやり取りを定義する。

2.2 セキュリティとプライバシー

リソース管理者は、提供リソースを 非公開に保つことも、誰にでも公開することも、その可視性を制約された一群の 要求エージェントに限定することもできる。

2.3 適合性

非規範的と明示された節に加え、この仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様のそれ以外のすべては規範的である。

この文書におけるキーワードMAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED、SHOULD、およびSHOULD NOTは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されるとおりに解釈される。

LWSサーバーは、この仕様における関連するすべての「MUST」 文に適合するHTTPサーバー[rfc9112]である。具体的には、 この文書の9. 操作における関連する規範的な「MUST」文を尊重MUSTする。

LWS クライアント は、 HTTP クライアント [rfc9112] であり、本仕様書における関連するすべての「MUST」記述に準拠するものです。具体的には、本書の9. 操作における関連する規範的な「MUST」記述を 遵守しなければなりません。

2.4 スコープ図

次の図は、実装の指針となる プラットフォーム非依存のモデルである。

図: システムコンテキストは、LWS システムとその主要コンポーネントを示す
図 1 システムコンテキストは、LWS システムとその主要コンポーネントを示す。

3. 用語

「認可サーバー」および「クライアント」という用語は、OAuth 2.0 認可フレームワーク [RFC6749] によって定義されます。

「エンドユーザー」および「発行者」という用語は、OpenID Connect Core 1.0 [OPENID-CONNECT-CORE] によって定義されます。

この仕様では、次の用語を定義します。

(リスクのある機能)課題: セクションが削除される可能性があります

本仕様は操作を提供 リソースに対して定義し、その結果生じる状態の変化、および応答であり、要求元エージェントに要求された情報を提供するか、またはその 結果を通知する操作。 操作とは、以下のアクションのいずれかであり、 提供リソースに対して実行できる:

  • リソース作成 -
  • リソース読み取り -
  • リソース 更新 -
  • リソース削除 -

次のセクションでは、これらの操作の意味論および応答について これらの操作について説明しますが、次のコア応答は、あらゆる操作に適用されます:

  • 成功 - 操作が完了したと考えられる。これは、リソース表現であり、提供リソースの内容を伝える。成功応答は このリソース作成操作には定義されない。代わりに作成済みを参照してください。
  • 許可されて いない
  • 不明な 要求元
  • 不明な エラー - 仕様で予期されていないエラー条件に対して予約されている本 仕様

4. 認証

この節は、Linked Web Storageサーバーとやり取りするエージェントおよびエンドユーザーを識別するためのメカニズムを定義する。 この仕様は、認証資格情報の特定の形式を義務付けないが、既存の身元システムを Linked Web Storage認可フレームワークと組み合わせて使用する方法を記述する。

4.1 認証 資格情報データモデル

このセクションで説明するデータモデルは、認証資格情報の任意の 具体的なシリアライゼーションに対する要件を概説します。

認証資格情報には、対象に関する改ざんを検知可能なクレームを MUST 含めなければなりません。これには以下が含まれます:

4.2 認証 資格情報の検証

認証資格情報の検証には、検証者と資格情報の発行者との間の信頼 関係が必要である。この信頼関係は、アウトオブバンドのメカニズムを通じて確立されてもMAYよい。 検証者と発行者との間の信頼を確立するための追加メカニズムは、特定の認証スイートで概説される。

認証資格情報は署名されなければMUSTならない。署名には非対称暗号を用いることがRECOMMENDEDされる。

4.3 認証 資格情報型識別子

各認証スイートは、トークン型URIに関連付けられなければMUSTならない。 認証スイートは、IANA「OAuth URI」レジストリで定義されたURIを使用すべきSHOULDである。

5. 認可

Linked Web Storageは、Web上で保護されたデータを永続化し管理するためのメカニズムを記述する。 認可は、 エージェントが この保護されたデータにアクセスするためにアクセストークンを要求し提示するためのメカニズムである。

この節は、アクセストークンを取得し提示するための基準メカニズムとして、OAuth 2.0 [RFC6749]に基づく認可フレームワークを定義する。 サーバーは、この基準を超える追加の認可メカニズムをサポートしてもMAYよい。

5.1 ロール

LWS認可における役割は、OAuth 2.0の1.1節[RFC6749]で定義されているものと同じである: リソース所有者、 リソースサーバー、 クライアント(曖昧さを避けるため、この仕様では認可クライアントと 呼ぶ)、および 認可サーバー。 ストレージサーバーは、LWSストレージ仕様にも適合するリソースサーバーの一種である。

5.2 プロトコルフロー

この仕様は、クライアントと認可サーバーとの間のやり取り、および クライアントと適合ストレージサーバーとの間のやり取りを記述する。

認可サーバーとストレージサーバーとの間のやり取りは、この仕様の範囲外である。 認可サーバーはストレージサーバーと同じサーバーであってもよく、別個の実体であってもよい。

5.2.1 認可サーバーの 検出

ストレージサーバーが管理するすべての保護されたリソースには、有効なアクセストークンが必要であり、その生成元は 信頼された 認可サーバーである。クライアントは、信頼された認可サーバーの場所を検出するために、 次のような 認可されていないHTTPリクエストを保護されたリソースに送信できる。

401 (Unauthorized) レスポンスを生成するストレージサーバーは、次のものを送信しなければならない: WWW-Authenticateヘッダーフィールドであり、 少なくとも1つの適合するチャレンジを含むもの。適合するチャレンジは、次のものを含まなければならない: 以下の resource_metadataパラメーターであり、[RFC9728]の5.1節で定義され、その値は次のURLである: 以下の 保護されたリソースのメタデータ文書で、 要求されたリソースに対応するもの。

レスポンスには、次のものを識別するLinkヘッダーも含めなければならない: ストレージであり、 要求されたリソースを含むもの。これは6.1.2 検出とバインディングで説明されている。クライアントは、このURIを resourceパラメーターとしてアクセストークンの要求時に指定する。これは 5.2.5.1 リクエストで説明されている。

その他のヘッダーやパラメーターを含めてもよい。

以下に401レスポンスの例を示す。

HTTP/2 401 Unauthorized
Link: <https://storage.example/storage_1>; rel="https://www.w3.org/ns/lws#storage"
WWW-Authenticate: Bearer resource_metadata="https://storage.example/.well-known/oauth-protected-resource/storage_1/photos/img.jpg",
                error="invalid_token"

5.2.2 保護されたリソースの メタデータ

(削除の可能性がある機能)課題

作業部会は、保護されたリソースのメタデータへの 対応について、実装者からのフィードバックを積極的に求めている。 十分な実装経験が集まらなければ、この機能は削除または変更される可能性がある。

保護されたリソースのメタデータ文書は、クライアントが取得する方法を記述する: アクセストークンであり、 リソースに対応するもの。この文書は、OAuth 2.0 保護されたリソースのメタデータに適合しなければならない [RFC9728]。

本仕様は[RFC9728]を次のように拡張する: authorization_serversパラメーターは必須であり、 保護されたリソースのメタデータ文書に含まれ、その値には次のものを含めなければならない: 少なくとも1つの発行者識別子であり、 認可サーバーのもの。

注

保護されたリソースのメタデータ文書内のresource値が識別するのは、 要求されたリソースであり、 それを含むストレージではない。対照的に、 トークンリクエストのresourceパラメーターは、 ストレージを識別し、これはアクセストークンの対象者となる。

以下に保護されたリソースのメタデータ文書の例を示す。

{
    "resource": "https://storage.example/storage_1/photos/img.jpg",
    "authorization_servers": ["https://authorization.example"]
}

5.2.3 検出結果の検証 (クライアントによる)

クライアントがアクセストークンの取得に使用する値は、ストレージサーバーによって401 (Unauthorized) レスポンスで提供される。アクセストークンを要求する前に、クライアントは次の検査を実行しなければならない: 以下の各検査では、 検出された値を、401レスポンスを生じさせた要求先URIと比較する。いずれかの検査が失敗した場合、 クライアントはしてはならない: 検出された値を使用してアクセストークンを要求すること。

  • resource_metadata URLは、同一のスキームおよび権限部を持たなければならない (要求先URIと比較して)。
  • resource値について、保護されたリソースのメタデータ文書のものは、しなければならない:次のものと同一であること: 要求先URI。これは[RFC9728]の3.3節で要求されている。
  • クライアントは取得しなければならない:ストレージ記述を、ストレージで、Linkによって識別されるものについて。 このヘッダーで識別されるストレージのStorageRootサービスのserviceEndpointは、しなければならない:同一のスキーム および権限部を要求先URIと持つこと。
注

これらの検査は、保護されたリソースのメタデータとストレージの両方が次のものを記述することを保証する: リクエストの送信先であるサーバー、 すなわちクライアントがリクエストを送信した先。これにより、7.3節で説明されているTLSサーバー認証、 [RFC9728]のものが、 メタデータに適用される。これらがなければ、悪意あるサーバーはクライアントにアクセストークンを取得させる可能性がある: 別の ストレージ用のものを取得させ、そのトークンを再利用する。クライアントはストレージ記述をキャッシュして、その取得を回避できる: 各 トークンリクエストの前の取得を。16.3 リソースの検出を参照。

5.2.4 認可サーバーの メタデータ

認可サーバーは、クライアントが利用できるメタデータリソースを提供しなければならない (エンドポイントの場所および機能を検出できるようにするため)。これは [RFC8414]で説明されている。このメタデータリソースは、 しなければならない:次のパスを持つURLで利用可能であること: /.well-known/lws-configuration。

[RFC8414]で定義されたメタデータに加えて、 LWS認可サーバーのメタデータ文書は、 以下のパラメーターを定義する:

  • subject_token_types_supported OPTIONAL。有効な subject_token_type 値のリストを含む JSON 配列であり、 認可サーバーのトークンエンドポイントで指定できる。認可サーバーは、 SHOULD このエントリをサーバーメタデータ文書に含めることで、サポートする サブジェクトトークンを公表すべきです。
  • subject_identifier_types_supported OPTIONAL。認可サーバーがサポートするサブジェクト識別子タイプのリストを含む JSON 配列。各値は、"https:"などのスキームで始まる URI、または分散型識別子の場合は "did:" に続いて DID メソッド名(例: "did:web"、 "did:key")が続く URI です。 認可サーバーは、SHOULD サポートするサブジェクト識別子タイプを サーバーメタデータ文書にこのエントリを含めることで公表すべきです。 省略された場合、デフォルト値は ["https"] です。

以下に認可サーバーのメタデータリソースの例を示す。

{
    "issuer": "https://authorization.example",
    "grant_types_supported": [
        "urn:ietf:params:oauth:grant-type:token-exchange"],
    "token_endpoint": "https://authorization.example/token",
    "jwks_uri": "https://authorization.example/jwks",
    "claims_supported": [
        "sub",
        "iss",
        "client_id",
        "aud"],
    "response_types_supported": [
        "token"],
    "subject_token_types_supported": [
        "urn:ietf:params:oauth:token-type:jwt",
        "urn:ietf:params:oauth:token-type:id_token"],
    "subject_identifier_types_supported": [
        "did:web",
        "did:key",
        "https"]
}

5.2.5 トークン交換

LWS認可サーバーは、OAuth 2.0に適合する認可サーバーであり、発行できる: クライアントへのアクセストークンを、 ストレージサーバーで使用するために。アクセストークンが発行されるには、クライアントはまず提示する必要がある: 有効なサブジェクトトークンを、 例えば認証資格情報を、 認可サーバーにOAuth 2.0 トークン交換[RFC8693]を介して。

5.2.5.1 リクエスト

認可サーバーのトークンエンドポイントは、次に対応しなければならない: urn:ietf:params:oauth:grant-type:token-exchange グラント型。これはOAuth 2.0 トークン交換[RFC8693]で説明されている。

トークン交換グラント型を実行する場合、以下の追加要件が適用される:

  • resourceパラメーターは必須である。この パラメーターの値はURIでなければならず、使用される: 結果として得られるアクセストークンのaud(対象者)クレームを設定するために。 指定する値は、次のものでなければならない: ストレージのURIであり、要求されたリソースを含むもの。これは、 Linkヘッダー内で提供される: 認可されていないレスポンスのもの。認可サーバーは、拒否しなければならない: resourceパラメーターが 未知の、または信頼されていないストレージを識別するすべてのリクエストを。
  • subject_tokenパラメーターは必須である。 このパラメーターの値には、有効なサブジェクトトークンを含めなければならない。 例えば認証 資格情報など。
  • クライアントにアクセストークンを返す前に、認可サーバーはしなければならない:提示されたすべてのトークンの検証に成功すること。

トークンリクエストの非規範的な例(subject_tokenパラメーターは 切り詰められている)。

POST /token HTTP/1.1
Host: authorization.example
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&resource=https%3A%2F%2Fstorage.example%2Fstorage_1
&subject_token=eyJ0eXAiOiJhcytqd3QiLCJhbGciO...fiK51VwhsxJ-siBMR-YFiA
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Aid_token
5.2.5.2 レスポンス

トークンリクエストが有効であり、クライアントがそのリクエストを行うことを認可されている場合、 認可サーバーのレスポンスはしなければならない: OAuth 2.0 認可フレームワークの5.1節に適合すること[RFC6749]。結果として得られるアクセス トークンは、適合しなければならない: OAuth 2.0 アクセストークン用のJSON Web Tokenプロファイルに[RFC9068]。

さらに、アクセストークンは以下の要件を満たす必要がある:

  • sub(主体)— 必須。このクレームは、 しなければならない:エージェントを識別するURIであること。そのエージェントが実行するのは、 当該操作である
  • iss(発行者)— 必須。このクレームは、 しなければならない:認可サーバーのURIであること
  • client_id(クライアントID)— 必須。 このクレームは、クライアントを識別するURIでなければならない。
  • aud(対象者)— 必須。このクレームは、 しなければならない:指定されたURIを含むこと。その指定元は、 クライアントであり、resourceパラメーターに指定する。このURIはストレージのURIである。この 値は、制限するために使用される: アクセストークンが有効となるエンティティを。
  • exp(有効期限)— 必須。 認可サーバーは、有効期間の短いトークンを発行するべきである (推奨:300秒以下)。これは、トークンの 盗難によるリスクを抑えるためである。
  • iat(発行時刻)— 必須。
  • jti(JWT ID)— 必須。

以下に成功したトークンレスポンスの非規範的な例を示す。

HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token":"eyJ0eXAiOiJhcytqd3QiLCJhbGciOiJFUzI1NiIs...DeWt4QuZXso",
    "token_type":"Bearer",
    "expires_in":300
}

すべての無効または認可されていないリクエストは、エラーレスポンスを生じさせなければならない (5.2節で説明されているとおり)。 これはOAuth 2.0 認可フレームワーク[RFC6749]の節である。

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
    "error":"invalid_request"
}
5.2.5.3 アクセストークンの例

この節は非規範的である。

以下に認可サーバーが発行したアクセストークンの例を示す。

{
  "kid": "ec51c6b2",
  "kty": "EC",
  "alg": "ES256",
  "crv": "P-256",
  "typ": "at+jwt"
}
.
{
  "sub": "https://id.example/agent",
  "iss": "https://authorization.example",
  "client_id": "https://app.example/id",
  "aud": "https://storage.example/storage_1",
  "exp": 1735686300,
  "iat": 1735686000,
  "jti": "550e8400-e29b-41d4-a716-446655440000"
}
.
signature

5.2.6 トークンの検証 (ストレージサーバーによる)

クライアントは、アクセストークンを取得すると、そのトークンをストレージサーバーに提示する。 ストレージサーバーは、何らかの操作を実行する前に、このトークンを検証する責任を負う。

5.2.6.1 提示

クライアントは、ストレージサーバーにアクセストークンを提示しなければならない。その際に使用するのは、 Authorizationヘッダーであり、 次で定義されている認証スキームを伴う:[RFC6750]。

Authorization: Bearer eyJ0eXAiOiJhcytqd3QiLCJhbGciOiJFUzI1NiIs...DeWt4QuZXso
5.2.6.2 検証

ストレージサーバーは、アクセストークンを検証しなければならない。そのために実行するのは、 以下の検査であり、いずれかが失敗した場合はリクエストを拒否する:

  • JWT署名の検証:認可サーバーの公開鍵を使用してJWT署名を検証する。 その鍵の取得元は、 認可サーバーメタデータで指定されたjwks_uriである。ストレージサーバーは、するべきである:これらの鍵をキャッシュすること。また、 しなければならない:鍵のローテーションに対応すること。
  • 発行者の検証:issクレームが、想定される認可 サーバーの識別子と一致することを検証する。
  • 対象者の検証:audクレームに、次のURIが含まれていることを検証する:ストレージであり、含むものは、 対象リソースである。
  • 時刻の検証。システム間で許容される時計のずれを考慮する。
    • 現在時刻がexp(有効期限)クレームより前であることを検証する。
    • 現在時刻がnbf(有効期間の開始)クレームより前でないことを検証する。これが 存在する場合に限る。
    • iat(発行時刻)クレームが未来でないことを検証する。

検証に失敗した場合、ストレージサーバーは401 Unauthorizedを返さなければならない (WWW-Authenticateヘッダーを伴い、 resource_metadataパラメーターと適切なエラーパラメーターを含む (例: invalid_token、invalid_request、またはinsufficient_scope))。

トークンがその他の点では有効でも、認可ポリシーが要求された 操作を許可しない場合、 ストレージサーバーはリクエストを拒否しなければならない。

6. 発見

6.1 ストレージ記述リソース

ストレージ記述リソースは、 クライアントが利用できる情報を提供する。 これは、ストレージとやり取りする際の情報であり、機能および サービスエンドポイントの記述を含む。

6.1.1 データモデル

ストレージ記述リソースは、 W3Cの管理対象識別子の特殊化である: 文書[CID-1.0]の。 これは、[CID-1.0]で定義されたデータモデルに適合し、次のもので拡張される: LWS固有のプロパティ。

  • id - idプロパティは必須である。その値は正規URIでなければならない (ストレージの)。 [CID-1.0]に従い、このURIは正規の 管理対象識別子文書のURLでもある。
  • type - typeプロパティは必須である。その値は文字列でなければならず、 その文字列は次と等しい: Storage。または、Storageと等しい項目を含む文字列の集合でなければならない (大文字と小文字を区別する)。
  • capability - capabilityプロパティは任意である。その値は集合でなければならない: 機能の集合であり、各機能は以下のプロパティを含むマップで記述される。 追加のプロパティが存在してもよい。
    • id - idプロパティは任意である。存在する場合、その値はしなければならない: URIであること。
    • type - typeプロパティは必須である。その値は文字列でなければならない (または文字列の集合)。
  • service - serviceプロパティは必須である。その値はサービスの集合でなければならず、 各サービスは以下のプロパティを含むマップで記述される。追加の プロパティが存在してもよい。 この集合は、typeが次と等しいサービスを含まなければならない: StorageRoot。
    • id - idプロパティは任意である。存在する場合、その値はしなければならない: URIであること。
    • type - typeプロパティは必須である。その値は文字列でなければならない (または文字列の集合)。
    • serviceEndpoint - serviceEndpoint プロパティは必須である。その値はしなければならない: URIであること。
例 9: 最小限のストレージ記述リソース
{
  "@context": [
    "https://www.w3.org/ns/cid/v1",
    "https://www.w3.org/ns/lws/v1"
  ],
  "id": "https://storage.example/",
  "type": "Storage",
  "service": [{
    "type": "StorageRoot",
    "serviceEndpoint": "https://storage.example/root/"
  }]
}

6.1.2 発見とバインディング

GETおよびHEADリクエストのうち、ストレージリソースを対象とするものへのすべてのレスポンスは、必須として次を含む: Linkヘッダーで、そのターゲットがストレージの正規URIであり、さらに 関係 (rel)パラメーターの値がhttps://www.w3.org/ns/lws#storageと等しいもの。

ストレージURIへのリクエストは、文書を返すことが必須であり、 その文書は次の ストレージ記述リソースのデータモデルに適合し、 メディア型はapplication/lws+cidである。 ただし、コンテンツネゴシエーションによって異なる形式が要求される場合を除く。

6.1.3 ストレージ機能

ストレージ記述は、追加機能の記述を含むことがある。 これらの機能に対応するのは、ストレージである。

6.1.4 ストレージサービス

ストレージ記述リソースは、必須としてStorageRootサービスを含み、その serviceEndpointは、ストレージルートコンテナーのURIである。 追加のサービスで、ストレージに接続されたものも存在してよい。 これらの追加サービスのAPI定義は、本仕様の範囲外である。

6.1.5 ストレージ 記述表現

ストレージ記述は、必須としてメディア型application/lws+cidで直列化可能でなければならない。 @contextプロパティは、次のURIで始まる配列であることが必須である: https://www.w3.org/ns/cid/v1 およびhttps://www.w3.org/ns/lws/v1。 その他の表現は、コンテンツネゴシエーションを通じて利用可能であってもよい。

例 10: ストレージ記述リソース
{
  "@context": [
    "https://www.w3.org/ns/cid/v1",
    "https://www.w3.org/ns/lws/v1"
  ],
  "id": "https://storage.example/",
  "type": "Storage",
  "capability": [{
    "type": "https://feature.example/PatchSupport",
    "format": {
      "text/turtle": ["application/sparql-update"],
      "application/n-triples": ["application/sparql-update"],
      "application/linkset+json": ["application/json-patch+json", "application/merge-patch+json"]
    }
  }, {
    "type": "https://feature.example/ResumableUploads"
  }, {
    "type": "https://feature.example/ContentNegotiation",
    "source": "application/ld+json",
    "target": ["text/turtle", "application/n-triples"]
  }, {
    "type": "https://feature.example/ContentNegotiation",
    "source": "image/jpeg",
    "target": ["image/png"]
  }],
  "service": [{
    "type": "StorageRoot",
    "serviceEndpoint": "https://storage.example/root/"
  }, {
    "type": "NotificationService",
    "serviceEndpoint": "https://storage.example/notification/api",
    "subscriptionType": ["WebhookSubscription"]
  }, {
    "type": "TypeIndexService",
    "serviceEndpoint": "https://storage.example/types/index"
  }, {
    "type": "TypeSearchService",
    "serviceEndpoint": "https://storage.example/types/search"
  }, {
    "type": "DataSharingService",
    "serviceEndpoint": "https://storage.example/sharing/api"
  }]
}

7. 論理リソース編成

7.1 コンテナモデル

Linked Web Storageは、リソースをコンテナーに整理する。コンテナーは、 メンバーと呼ばれる他のリソースへの参照を保持する特殊なリソースである。コンテナーは、 ディレクトリーやコレクションに類似した整理単位として機能し、クライアントによるリソースのグループ化、検出、 およびナビゲーションを可能にする。コンテナーは、メンバーリソースへの参照を維持する。 これらには、コンテナーではないリソースと追加のコンテナーリソースの両方を含めることができ、それによって 階層構造を形成できる。通常、コンテナーが保持する固有のコンテンツは、 メタデータやメンバーの列挙以外には最小限であり、その主な役割は集約および構造化である: 下位リソースの。ストレージシステムのルートは、コンテナーとして指定され、 上位の親を持たない最上位の整理単位として機能する。コンテナー表現の構造は、8.1 コンテナー 表現で定義され、そのメディア型およびページネーションの要件は、12. LWSメディア型で定義される。 ストレージは、ルートコンテナーとして機能し、直接書き込みを可能にしてもよい。

すべてのLWSストレージには、ストレージ ルートがあり、最上位の整理単位として機能する。ストレージルートは親を持たず、次のものへのエントリーポイントとして機能する: ストレージ 階層。

LWSのリソースは、次のいずれかに分類される:

7.2 包含

リソースとその親コンテナとの間の包含関係は、rel="up"リンク 関係によって表現される。サーバーは、任意の 非ルートリソースに対するGETおよびHEAD要求への応答において、親コンテナを指す rel="up"を持つLinkヘッダーを含めなければMUSTならない。

Link: </alice/notes/>; rel="up"

コンテナのメンバーは、その表現内で itemsプロパティを用いて一覧化される。サーバーがこの一覧を管理するため、クライアントは直接変更できない。 メンバーシップの変更は、リソースの作成および削除の副作用として発生する。

7.3 包含の完全性

サーバーは、常に包含の完全性を維持しなければMUSTならない:

7.4 リソース識別

リソースはURIによって識別されます。リソースのURIは、包含階層内の位置から独立しています。サーバーはリソースの 作成時にURIを割り当て、クライアントヒントを組み込んでもよいものとしますが、クライアントはURI構造が包含を反映していると仮定すべきではありません。

包含関係は、URIパス構造ではなく、メタデータ (rel="up"リンクおよびコンテナ 表現内のitemsプロパティ)を通じて表現される。この分離により、明確に定義された編成モデルを維持しながら、 サーバーはURI割り当てに柔軟性を持てる。

7.5 コンテナメンバーシップ と認可

クライアントがコンテナへの読み取りアクセス権を持つ場合、 コンテナ 表現は、そのコンテナに含まれるリソースのうち、 クライアントがアクセス権を持つすべてのリソースの識別子を含まなければMUSTならない。また、そのコンテナに含まれるリソースのうち、クライアントがアクセス権を持たないリソースの識別子を 含んでもMAYよい。

クライアントがコンテナ一覧を読み取れることは、含まれる リソース自体へのアクセス権を意味せず、その逆も同様である。

8. コンテナ

8.1 コンテナ表現

LWS のコンテナー表現はコンテナーとその内容を記述する。この節では、その表現が application/lws+jsonとして提供される場合の必須プロパティと任意のプロパティを定義する。他の RDF メディア タイプの表現は、コンテンツネゴシエーションを通じて要求できる。

8.1.1 コンテナプロパティ

コンテナ表現は、次のプロパティを含まなければMUSTならない:

  • id: コンテナのURI。
  • type: 値"Container"。
  • totalItems: クライアントに開示できるコンテナ内に含まれるリソースの総数を示す整数。 この数は正確であるべきSHOULDだが、概算であってもMAYよい。
  • items: 含まれるリソース記述の配列(下記参照)。 コンテナが空の場合、これは空配列でなければMUST ならない。コンテナ一覧が ページ分割されている場合、itemsは現在のページのリソースのみを含む。詳細はページネーションを参照。

8.1.2 包含リソース 記述

items配列内の各エントリーは、コンテナ内に含まれるリソースを記述する。包含リソース記述は、 次を含まなければMUSTならない:

  • id: 含まれるリソースのURI。
  • type: リソースの型。"DataResource"または "Container"、あるいはこれら2つの文字列の少なくとも一方を含む配列でなければMUSTならない。 サーバーは、追加のユーザー定義型をURIとして含めてもMAYよい (例: ["DataResource", "http://example.org/customType"])。

包含リソース記述は、次を含むべきSHOULDである:

  • format: リソースのメディア型(例: "text/plain"、"image/jpeg")。DataResourcesについては存在しなければ MUSTならない。
  • size: リソースのサイズ(バイト単位)。整数として表現される。
  • modified: リソースが最後に変更された日時。 ISO 8601日時文字列として表現される。

8.1.3 コンテナ 表現の例

次の例は、コンテナーが https://storage.example/alice/notes/ にあり、2 つのリソースを含むことを示す。他のタブには、 同じコンテナーが LWS プロファイルの他の RDF メディアタイプで示される。

{
  "@context": "https://www.w3.org/ns/lws/v1",
  "id": "/alice/notes/",
  "type": "Container",
  "totalItems": 2,
  "items": [
    {
      "type": "DataResource",
      "id": "/alice/notes/shoppinglist.txt",
      "format": "text/plain",
      "size": 47,
      "modified": "2025-11-24T12:00:00Z"
    },
    {
      "type": ["DataResource", "http://example.org/customType"],
      "id": "/alice/notes/todo.json",
      "format": "application/json",
      "size": 2048,
      "modified": "2025-11-24T13:00:00Z"
    }
  ]
}

9. 操作

この節では、Linked Web Storage (LWS) サーバーが必ずサポートしなければならない4つの中核操作を定義します。これらの操作は、実装の詳細ではなく意味論に重点を置き、 トランスポートに依存しない方法でリソースおよびコンテナーを操作します。各操作では 入力、期待される動作、および可能な応答を指定します。応答には、成功を示す情報、リソースの 表現(該当する場合)、およびエラー条件が含まれます。実装は、これらの操作を原子的かつ一貫して必ず 処理しなければなりません。つまり、各操作は完全に成功するか、 部分的な副作用を残さずに失敗します。エラーの場合、応答は機密情報を漏洩することなく問題を理解するのに 十分な詳細をエージェントに提供することが推奨されます。

各中核操作(作成、読み取り、更新、削除)について、使用するHTTPメソッド、必要な ヘッダーまたはその他の特別な考慮事項(コンテンツネゴシエーション、コンテナー一覧のページネーション、 および条件付きリクエストを含む)、ならびにサーバーが実行し返すべき内容を説明します。結果を示すために標準のHTTPステータスコードを使用し、 クォータ超過 (507 Insufficient Storage)や前提条件の失敗(412 Precondition Failed)などのシナリオには追加の対応付けを行います。この バインディングは、Web標準と自然に統合されるよう、HTTP/1.1および関連するRFC(HTTP の意味論については[RFC7231]、範囲 リクエストについては[RFC7233]、PATCHについては[RFC5789]、Web Linkingについては[RFC8288]、 およびLink Setsについては[RFC9264])に準拠するよう努めます。発見可能性は、 Linkヘッダーや401応答のWWW-Authenticateヘッダーなどの仕組みによって重視され、 URIの場所をハードコードすることを回避します。操作全体でメタデータの統合が必要であり、原子性と、 サーバー管理プロパティおよびユーザー管理プロパティのためのLink Setsの使用を保証します。

注: この仕様のすべての例と同様に、この節で示す例(HTTPリクエスト およびレスポンスのスニペット)は非規範的であり、典型的な使用法を説明することを目的としています。実際の 要件は説明文および表に記載されています。また、このバインディングはHTTP( 最初の対象プロトコルとして)を扱いますが、LWS操作は原理上、将来ほかのプロトコルにバインドすることもできます。 コンテナー表現のメディア型要件は、12. LWS メディア型で定義されています。

9.1 メタデータ

This section defines the model for associating metadata with Storage Resources。LWS metadata system は、型付き link を使用してサーバーが resource 間の関係を記述できる Web Linking [RFC8288] の原則に基づいている。 Metadata は発見可能性を向上させ、自己記述型 API をサポートし、resource 操作および container 階層と整合する。

Metadata Model LWS におけるすべての metadata は、resource(link context)を起点とする型付き link の集合として表現される。 各 link は以下で構成される。

Metadata は resource とその representation を区別し、該当する場合には複数の media type を許可する。 data resources の場合、metadata には representation が含まれ、 それぞれに format および省略可能な sizeInBytes がある。 containers および data resources については、 親 container resource への link を、 resource の metadata の一部であるとみなす。

Linkset Resource storage 内の各 resource について、サーバーは [RFC9264] に従い、metadata link をスタンドアロン resource として利用可能にしなければならない。

メタデータの検出 クライアントは、主にGETまたはHEAD要求への応答に含まれるLinkヘッダーを通じてメタデータを検出します。

メタデータの種類

カテゴリー 説明
システム管理 サーバーによって維持され、読み取り専用です。linkset、type、 format、size、modifiedが含まれます。
コアメタデータ クライアントによって管理されます(サーバーの制限に従います)。up、 items、title、creatorが含まれます。
ユーザー定義 ユーザーが作成したカスタム語彙およびインデックス。

変更可能性に関する考慮事項 コアメタデータは、クライアントによって変更してもよいものとします。相互運用性を確保するため、サーバーは、 必ず標準HTTPヘッダーを使用して、その能力を通知しなければなりません。

  1. メソッドの検出:サーバーは、Allowヘッダーを介して、リンクセットリソースに対するGETおよびPATCH 操作のサポートを必ず通知しなければなりません。

  2. パッチ形式の検出:サーバーは Accept-Patch ヘッダーを介して JSON Patch [RFC6902] のサポートを 必須 として通知しなければならない: Accept-Patch: application/json-patch+json。

  3. 任意のメソッド:サーバーは、任意でPUTまたは代替のパッチ形式をサポートできます。 サポートする場合、それらは必ずそれぞれAllowヘッダーおよびAccept-Patch ヘッダーに含まれなければなりません。

[!IMPORTANT] クライアントは、リソースヘッダーで通知されていない限り、PUTまたは特定のパッチ形式のサポートを仮定すべきではなく、 405 Method Not Allowedまたは415 Unsupported Media Type応答を必ず適切に処理しなければなりません。

メタデータの管理 メタデータは、リソースに関連付けられたリンクセットリソースの URI を操作することで管理されます。サーバーは、GET および HEAD リクエストへの応答に、[RFC9110] で定義されている ETag ヘッダーを必ず含めなければなりません。

9.2 リソースを作成する

リソースの作成操作は、新しい提供リソースを既存のコンテナーに追加する。この 操作は、データリソースとサブコンテナーの両方の作成を扱う。

入力:

動作:

考えられる応答:

新しいリソースは、対象のコンテナー URI に POST を使用して作成され、サーバーが 最終的な識別子を割り当てる。クライアントは任意で新しい リソースのユーザー管理の初期メタデータを、POST 要求に 1 つ以上のLinkヘッダーを含め、 [RFC8288] の Web リンクの構文に従って提供してもよい。サーバー管理のメタデータは必ず 作成時にサーバーによって自動生成されなければならず、決して クライアントが提供したリンクによって上書きされてはならない。

成功時、サーバーは必ず新しい URI を Locationヘッダーに含めて 201 ステータスコードを返さなければならない。サーバーは必ずLinkヘッダーに 主要なサーバー管理のメタデータを含めなければならない。これには、親コンテナーへのリンク (rel="up")と、作成されたリソース専用のリンクセットリソースへのリンク (rel="linkset"; type="application/linkset+json")が含まれる。追加のリンクには原則としてrel="type"を含めるべきである( https://www.w3.org/ns/lws#Containerまたは https://www.w3.org/ns/lws#DataResourceを示す)。本文は任意で空にするか、 リソースの最小限の表現を含めてもよい。すべてのメタデータの作成とリンク付けは必ず整合性を維持するためにリソースの作成とアトミックに行わなければならない。

POST(コンテナー URI への要求) – サーバーが割り当てる名前で作成: POST を使用して、既存のコンテナー内に新しいリソースを追加する。サーバーが リソースの識別子を割り当てる。クライアントは、作成するリソースのタイプを次のように示す。

例(POST による新しいデータリソースの作成):

POST /alice/notes/ HTTP/1.1
Host: example.com
Authorization: Bearer <token>
Content-Type: text/plain
Content-Length: 47

milk
eggs
bread
butter
apples
orange juice

この例では、クライアントはコンテナー/alice/notes/に POST する。 text/plainの内容(買い物リスト)を提供する。/alice/notes/が存在し、 クライアントが認可されている場合、サーバーは新しいデータリソースを作成し、それをコンテナーのメンバー一覧に追加する。

例(POST への応答 — データリソース):

HTTP/1.1 201 Created
Location: /alice/notes/shoppinglist.txt
Content-Type: text/plain; charset=UTF-8
Link: </alice/notes/shoppinglist.txt.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/notes/>; rel="up"
Link: <https://www.w3.org/ns/lws#DataResource>; rel="type"
Content-Length: 0

成功時には、新しい URI をLocationヘッダーに含めて 201 Created を返す。本文は 空でも、最小限の表現でもよい。 対象のコンテナー/alice/notes/が存在しない場合、サーバーは 必ず別のステータスコードの方が適切でない限り、404 エラーステータスを返さなければならない。

コンテナーの作成: 新しいコンテナーを作成するには、クライアントは既存の親コンテナーに対して、Container タイプを示すLinkヘッダーを 付けて POST を使用する。例:

POST /alice/ HTTP/1.1
Host: example.com
Authorization: Bearer <token>
Content-Length: 0
Link: <https://www.w3.org/ns/lws#Container>; rel="type"

例(POST への応答 — コンテナー):

HTTP/1.1 201 Created
Location: /alice/notes/
Link: </alice/notes/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
Content-Length: 0

これにより、/alice/notes/に新しいコンテナーが作成され、サーバーによって生成された rel="type"がhttps://www.w3.org/ns/lws#Containerであるメタデータも含まれる。

作成に関する追加の注記(HTTP バインディング):

メタデータの管理と取得(作成に関連): メタデータは主に読み取り操作によって取得されるが、作成時に生成される。クライアントは 作成直後に新しいリソース URI に GET または HEAD を使用して取得できる。クライアントは Preferヘッダーを使用して、特定のメタデータリンク(関係タイプによる)と 属性を含めるよう要求できる。

9.3 リソースを読み取る

既存のリソースの表現、またはコンテナーの一覧を取得する。

リソースの読み取り操作は、HTTP GET 要求(ヘッダーのみの要求には HEAD)を使用してリソースの表現を要求する。 動作は、対象 URL がコンテナーであるか、コンテナー以外のリソース(データリソース)であるかによって異なる。サーバーは必ず メタデータを通じてリソースのタイプを区別しなければならない。すべての応答は必ず 8.1 節で定義されるメタデータと統合しなければならず、これには rel="linkset"、rel="up"、rel="type"などの主要な関係を示すLinkヘッダーが含まれる。サーバーは必ず読み取り時にリソースの状態とそのメタデータの間の原子性を保証しなければならない。

GET(コンテナー以外のリソース) – リソースの内容を取得する: リソースの URI に GET を送信して、内容全体を取得する(認可されている場合)。200 OK で応答し、本文に データを含め、Content-Type を保存されているメディアタイプに一致させる。サーバーは必ず 部分取得のために [RFC7233] に従った範囲要求をサポートしなければならない。 応答には必ず [RFC9110] で定義されるETagヘッダーを含めなければならない。

例(ファイルの GET):

GET /alice/notes/shoppinglist.txt HTTP/1.1
Authorization: Bearer <token>
Accept: text/plain

これは/alice/notes/shoppinglist.txtの内容を要求し、クライアントが テキスト形式で取得したいことを示す。リソースが存在し、テキストであり、クライアントにアクセス権があると仮定すると、次のようになる。

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 34
ETag: "abc123456"
Link: </alice/notes/shoppinglist.txt.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/notes/>; rel="up"
Link: <https://www.w3.org/ns/lws#DataResource>; rel="type"

milk
cheese
bread
guacamole
soda
chocolate bars
hash
eggs

サーバーはテキストの内容を返した(Content-Lengthが示すとおり、合計 34 バイト)。 内容はファイルに保存されているデータと完全に同一である。ETag: "abc123456"は、 キャッシュおよび条件付き要求のための検証子である。応答には メタデータの発見可能性のためのLinkヘッダーが含まれ、upやtypeなどの必須フィールドを持つ。

GET(コンテナーリソース) – コンテナーの内容を一覧表示する: 対象 URI がコンテナーに対応する場合(メタデータのタイプによって判定される)、GET 要求は コンテナーのメンバーの一覧を返す。 Content-Type: application/lws+jsonを持つ応答は、 コンテナー 表現であり、コンテナー 表現の節で定義される。この表現では、一覧に各メンバーのメタデータが含まれる。 リソースの識別子(必須)、タイプ(必須)、メディアタイプ (DataResources では必須)、サイズ(推奨)、および 更新日時のタイムスタンプ(推奨)。

例(コンテナーの GET): コンテナーが存在し、クライアントにアクセス権があると仮定する。 タブには、異なるメディアタイプでの同じ要求が示される。12.1.2 コンテンツネゴシエーションを参照。

要求:

GET /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
Accept: application/lws+json

応答ヘッダー:

HTTP/1.1 200 OK
Content-Type: application/lws+json
ETag: "container-etag-789"
Link: </alice/notes/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"

応答本文:

{
  "@context": "https://www.w3.org/ns/lws/v1",
  "id": "/alice/notes/",
  "type": "Container",
  "totalItems": 2,
  "items": [
    {
      "type": "DataResource",
      "id": "/alice/notes/shoppinglist.txt",
      "format": "text/plain",
      "size": 47,
      "modified": "2025-11-24T12:00:00Z"
    },
    {
      "type": ["DataResource", "http://example.org/customType"],
      "id": "/alice/notes/todo.json",
      "format": "application/json",
      "size": 2048,
      "modified": "2025-11-24T13:00:00Z"
    }
  ]
}

この例では、/alice/notes/はコンテナーである。応答は LWS コンテキストを使用した JSON-LD で、必須のメタデータとともにメンバーを一覧表示する。各項目にはtype、 id、format、size、modifiedのタイムスタンプがフラットな プロパティとして含まれる。

いずれの場合も、サーバーは必ず応答ヘッダーに次のメタデータを含めなければならない。 [RFC9110] で定義されるETagヘッダーと、 rel="linkset"、rel="up"、rel="type"を持ち、それが コンテナーであることを示すLinkヘッダー。

HEAD(任意のリソースまたはコンテナー) – ヘッダーとメタデータのみ: LWS サーバーは必ずコンテナーと非コンテナーの両方について HEAD [RFC9110] をサポートし、 コンテナーと非コンテナーに対して、GET と同じヘッダーを返さなければならない。 (Content-Typeやメタデータ用のLinkを含む)が、本文は含めない。これにより、 内容を転送せずにメタデータを取得できる。

キャッシュと条件付き要求: LWS は HTTP のキャッシュセマンティクスを活用する。サーバーは原則として[RFC9110] で定義される条件付き要求をサポートすべきであり、 エンティティタグ(ETags)や日付ベースの検証子( If-Modified-Sinceヘッダーなど)の仕組みを含む。リソースまたはコンテナーの一覧が 変更されていない場合は、不要な転送を避けるために304 Not Modifiedで応答する。

発見可能性と認可: 発見可能性を高めるため、 401 Unauthorized応答には、 resource_metadataパラメーターを持つWWW-Authenticateヘッダーが含まれる。これは認可サーバーの発見で説明されており、クライアントが URI をハードコードせずに認可サーバーを特定できるようにする。

9.4 リソースを更新する

既存の[提供されるリソース]の状態を、完全な置換または部分的なパッチによって変更します。

リソースの更新は、PUT リクエスト(リソース全体を置換する場合)または PATCH リクエスト( 部分的な変更を適用する場合)によって、既存の提供される リソースの内容を変更します。これらの 操作を実行するには、クライアントがリソースの URL への書き込みアクセス権を持っていなければなりません。 注: この節では、リソースの主要な内容の更新について説明します。メタデータを更新するには、9.3.2節を参照してください。 LWS サーバーは、リソース URI に対する PUT および PATCH リクエストを、 関連付けられたリンクセットリソースに既定では影響を与えない、リソース内容のみの変更として扱わなければなりません。単一の原子的な操作で内容と メタデータの両方を任意に更新するために、クライアントはリソース URI への PUT/PATCH リクエストに Link ヘッダーを含め、優先指定 'Prefer: set-linkset'([RFC7240] で定義)を指定してもかまいません。この場合、 サーバーは、内容の変更を適用することに加えて、指定された Link ヘッダーをリンクセットの置換 (PUT の場合)または部分更新(PATCH の場合)として解釈しなければなりません。 この動作はサーバーにとって任意ですが、サポートする場合、意図しないメタデータの上書きを防ぐため、 Prefer ヘッダーを介して明示的に呼び出されなければなりません。複合更新をサポートしないサーバーは、その優先指定を無視しなければならないか、501 Not Implemented で応答しなければなりません。

PUT(リソース全体の置換) – 新しい完全な内容を 本文に入れ、一致する Content-Type(通常は既存の型と一致)とともにリソース URI に PUT を送信します。PUT は既存のリソースに対してべき等です。 クライアントは、同時変更の上書きを避けるため、 [RFC9110] で定義されている条件付きリクエストを使用するべきです。

例(PUT によるリソースの更新):

PUT /alice/personalinfo.json HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json
If-Match: "abc123456"
{
"name": "Alice",
"age": 30,
"city": "New London",
"state": "Connecticut"
}

この例では、クライアントは /alice/personalinfo.json にある既存の JSON リソースを更新しています。以前の GET または HEAD リクエストから受信したエンティティタグ (ETag)を含む If-Match ヘッダーを指定しています。サーバーはそれを 現在のエンティティタグ(ETag)と比較し、一致する場合は、指定された JSON で内容を置換します。一致しない場合、サーバーは更新を拒否します(その間にリソースが 他者によって変更されたためです)。 成功応答: 更新に成功した場合、サーバーは 200 OK で応答し、 更新された表現または何らかの確認(新しい内容やその一部など)を含めることができます。 あるいは、本文なしで成功したことを示すために 204 No Content で応答することもできます (特に、追加情報を伝える必要がない場合によく使用されます)。例:

HTTP/1.1 204 No Content

PATCH(部分更新) – HTTP PATCH メソッド [RFC5789] を使用すると、クライアントは新しい コンテンツ全体を送信する代わりに、リソースに対する部分的な変更を指定できる。これは、変更されたのが ごく一部だけである場合にコンテンツ全体を送信すると非効率になる大きなリソースや、特定の変更を適用したい並行編集に有用である。LWS サーバーは、最低限 JSON Patch をサポートしなければならない (application/json-patch+json)。これは [RFC6902] で定義されている。

リソースメタデータの更新(リンクセットに対する HTTP PUT / PATCH) リソースのメタデータは、Link ヘッダーの rel="linkset" を介して検出される、対応するリンクセットリソースを 変更することで更新されます。 完全な置換(PUT): 完全な リンクセット文書を本文に含む、リンクセットリソース URI への PUT リクエストは、リソースのすべてのメタデータを置換します。 部分更新(PATCH): リンクセットリソース URI への PATCH リクエストは、特定のリンクを追加、削除、または 変更します。

メタデータの条件付きリクエスト リソースのメタデータは複数の主体によって変更される可能性があるため、同時上書きを防ぐことが 重要です。サーバーとクライアントは、リンクセットリソースに対する PUT および PATCH 操作について、 [RFC9110] で定義されている条件付きリクエストを使用するべきです。サーバーが前提条件を満たさない条件付き リクエストを受信した場合、412 Precondition Failed ステータスコードでそのリクエストを拒否しなければなりません。 例(リンクセットを置換する PUT): クライアントはまずリンクセットを取得します。

GET /alice/personalinfo.json.meta HTTP/1.1
Authorization: Bearer <token>
Accept: application/linkset+json
HTTP/1.1 200 OK
Content-Type: application/linkset+json
{
  "linkset": [
    {
      "anchor": "/alice/personalinfo.json",
      "describedby": [ { "href": "/schemas/personal-info.json" } ]
    }
  ]
}

クライアントは次にライセンスを追加しようとします。新しい完全なリンクセット文書を構築し、PUT リクエストを送信します。

PUT /alice/personalinfo.json.meta HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/linkset+json
{
  "linkset": [
    {
      "anchor": "/alice/personalinfo.json",
      "describedby": [ { "href": "/schemas/personal-info.json" } ],
      "license": [ { "href": "https://creativecommons.org/licenses/by/4.0/" } ]
    }
  ]
}

成功した場合、サーバーは成功を示す応答を返します。

HTTP/1.1 204 No Content

更新規則の概要 リソースの内容のみを変更する場合 → リソース自体に PUT/PATCH を行います。 リソースのリンク(メタデータ)のみを変更する場合 → リソースに関連付けられたリンクセットリソースに PUT/PATCH を行います。 内容とリンクの両方を変更する場合 → 適切な Link ヘッダーと 'Prefer: set-linkset' の両方を含めて、リソース自体に PUT/PATCH を行います。両方の設定は既定では無効です。

9.5 リソースを削除する

リソースおよびそれに関連付けられたメタデータを完全に削除します。

リソース削除操作は、上記の抽象操作で定義されているように、HTTP DELETE メソッドを使用して実装されます。 この節では、入力、動作、および応答の HTTP バインディングを規定します。

DELETE リクエストは、削除するリソースまたはコンテナーの URI を対象とします。クライアントは、同時実行 チェックのために ETag を指定した If-Match ヘッダーを含めてもかまいません。

削除と包含: リソースが削除されるとき、サーバーは、その 親コンテナーの items リストから、そのリソースを原子的に削除しなければなりません。親コンテナーの totalItems の数も、それに応じて更新することが推奨されます。

コンテナー以外のリソースの場合、サーバーはリソースの内容、関連付けられたメタデータ(リンクセットリソース)、および親コンテナー内の包含参照を 削除します。

コンテナーリソースの場合、サーバーは既定で非再帰的 削除を行います。コンテナーが空でなく、再帰処理が要求されていない場合、サーバーは 409 Conflict でリクエストを拒否しなければなりません。サーバーは、削除対象のコンテナー内に含まれる すべてのリソースの再帰的削除をサポートしてもかまいません。クライアントは、 [RFC4918] で定義されているように、再帰的削除を要求するために Depth: infinity ヘッダーを使用しなければなりません。

成功した場合、サーバーは 204 No Content で応答しなければなりません。サーバーは、 [RFC9110] で定義されている条件付きリクエストをサポートすることが推奨されます。

クライアントに認可がない場合、サーバーは 403 Forbidden(クライアントの 識別情報は既知だが権限が不十分な場合)または 401 Unauthorized(有効な 認証が提供されていない場合)を返さなければなりません。リソースの存在を明らかにすることがセキュリティリスクとなる場合、 サーバーは代わりに 404 Not Found を返してもかまいません。

例(コンテナー以外のリソースを DELETE):

DELETE /alice/notes/shoppinglist.txt HTTP/1.1
Authorization: Bearer <token>
If-Match: "abc123456"

ETagが一致し、クライアントが認可されていると仮定すると、サーバーはリソース、そのメタデータを削除し、 親コンテナ/alice/notes/からそれを原子的に削除する:

HTTP/1.1 204 No Content

例(再帰なしで空でないコンテナをDELETEする):

DELETE /alice/notes/ HTTP/1.1
Authorization: Bearer <token>

/alice/notes/がリソースを含むと仮定すると、サーバーは削除を拒否する:

HTTP/1.1 409 Conflict
Content-Type: text/plain

Cannot delete container /alice/notes/ - container is not empty.

例(サポートされる場合、再帰でコンテナをDELETEする):

DELETE /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
Depth: infinity

サーバーが再帰をサポートし、クライアントがすべての内容に対する権限を持つと仮定すると、サーバーは コンテナとその子孫を原子的に削除する:

HTTP/1.1 204 No Content

9.6 HTTPステータス マッピングの概要

この表は、一般的な LWS の応答( 8節)を、一貫性を保つために HTTP ステータスコードおよびペイロードに対応付け、ページネーション、 条件付きリクエスト、クォータ制約、メタデータ統合などの具体的なシナリオを組み込んだものです:

LWS 応答 HTTP ステータスコード HTTP ペイロード
成功(読み取りまたは更新で、 データを返す場合) 200 OK 応答本文内のリソース 表現(GET の場合、または PUT/PATCH が内容を返す場合)と、関連するヘッダー (Content-Type、rel="linkset" や rel="up" などの メタデータ用 Link)を返します。コンテナー一覧の場合は、 規範的なコンテキストとメンバーメタデータ(ID、型、サイズ、タイムスタンプなど)を含む JSON-LD を含めます。
作成済み(新しいリソース) 201 Created 通常、応答本文はありません(または新しいリソースの最小限の表現)。新しいリソースの URI が Location ヘッダーに設定されます。サーバー管理メタデータ用の Link ヘッダー。
削除済み(返す内容なし) 204 No Content 応答本文はありません。リソースが削除されたか、リクエストが成功し、 それ以上返す内容がないことを示します。サーバーは、完全な削除に 410 Gone を使用してもかまいません。
不正なリクエスト(無効な入力または制約) 400 Bad Request 何が誤っていたかを説明するエラーの詳細。サーバーは、 "type"、"title"、"status"、 "detail"、"instance" などのフィールドを持つ JSON オブジェクトのような 構造化エラー応答には、[RFC9457] で定義されている 標準形式を使用することが推奨されます。

10. 通知

この節では、Linked Web Storageサーバーによって管理されるリソースへの変更に関する更新を、 クライアントが適時に受信するためのメカニズムを定義する。この仕様は共通の 通知データモデルおよびサブスクリプションメカニズムを定義する。具体的な配信チャネルについては、 個別の通知スイート仕様で説明する。

10.1 通知の発見

ストレージは通知に対応してもよい。通知に対応するストレージには、必須として、 サービスオブジェクトを自身のservice配列内で公開することが求められる。この配列は、ストレージ記述 リソース内にあり、オブジェクトのtypeはNotificationServiceと等しい。

サービスオブジェクトは、serviceEndpointプロパティを含むことが必須であり、その 値は、 サブスクリプションエンドポイントのURIである。サービスオブジェクトは、次を含むことが必須である: subscriptionTypeプロパティで、その値は文字列の配列であり、各文字列は、 対応するサブスクリプション型を識別する。

サービスオブジェクトに追加のプロパティが存在してもよい。

例 11: 通知を伴うストレージ記述 サービス付き
{
  "@context": ["https://www.w3.org/ns/lws/v1"],
  "id": "https://storage.example/",
  "type": "Storage",
  "service": [{
    "type": "NotificationService",
    "serviceEndpoint": "https://notification.example/subscriptions",
    "subscriptionType": [
      "WebhookSubscription"
    ]
  }]
}
注

サーバーは、すべてのサブスクリプション型に対応する必要はない。 subscriptionType配列は、利用可能な型を正確に示す。

10.2 通知データモデル

通知は、Notificationタイプを持つ JSON-LD文書として表現される。エンベロープは配信コンテキストに関するメタデータを保持し、 イベントを記述するActivity Streams 2.0 [ACTIVITYSTREAMS-CORE] [ACTIVITYSTREAMS-VOCABULARY] アクティビティを包含する。

10.2.1 エンベローププロパティ

通知エンベロープは、次のプロパティを持つ:

  • type — 必須。値は文字列 Notificationでなければならない。
  • storage — 必須。通知に関連付けられたLWSストレージを 識別するURI。
  • activity — 必須。JSONオブジェクトまたはJSON オブジェクトの配列であり、 それぞれがActivity Streams 2.0データモデルに適合し、発生したイベントを 記述する。10.2.2 アクティビティプロパティを参照。
例 12:通知エンベロープ
{
  "@context": [
    "https://www.w3.org/ns/lws/v1",
    "https://www.w3.org/ns/activitystreams"
  ],
  "type": "Notification",
  "storage": "https://storage.example/",
  "activity": {
    "id": "ec4dcc48-6581-4232-81c9-584525a98693",
    "type": ["Delete"],
    "object": {
      "id": "https://storage.example/alice/notes/shopping.txt",
      "type": ["DataResource"]
    },
    "origin": "https://storage.example/alice/notes/",
    "published": "2026-03-26T10:30:00Z"
  }
}

10.2.2 アクティビティプロパティ

activityプロパティ内の各アクティビティオブジェクトは、 Activity Streams 2.0データモデルに適合しなければならず、次のプロパティを 含まなければならない:

  • id — 必須。アクティビティを一意に識別する文字列。
  • type — 必須。少なくとも1つの Activity Streams 2.0アクティビティタイプを含む文字列の配列。
  • object — 必須。通知の対象となるリソースを 識別するJSONオブジェクト。objectは、次の プロパティを含まなければならない:
    • id — 必須。リソースのURI。
    • type — 必須。少なくとも 1つのリソースタイプを含む文字列の配列。この仕様によって定義される値には、 ContainerおよびDataResourceが含まれる。追加のタイプ値を 含めてもよい。
  • published — 必須。アクティビティが発生した時刻を 示す、[RFC3339]に適合する日時値。

次のプロパティは任意である:

  • actor — アクションを実行したエージェントを識別するURI。
  • target — リソースが追加されたコンテナーを 識別するURI。Createアクティビティで使用される。
  • origin — リソースが削除されたコンテナーを 識別するURI。Deleteアクティビティで使用される。

10.2.3 アクティビティタイプ

サーバーは、Storage Resource の変更を示すために、 以下の Activity Streams 2.0 activity type をサポートしなければならない。

  • Create — コンテナー内に新しいリソースが作成された。 targetフィールドは、リソースが追加されたコンテナーを示す。
  • Update — 既存のリソースの内容またはメタデータが変更された。
  • Delete — リソースが削除された。originフィールドは、 リソースが削除されたコンテナーを示す。

その他のアクティビティタイプもサポートしてよい。

10.2.4 通知のバッチ処理

サーバーは、activityプロパティの値としてアクティビティオブジェクトの配列を 提供することにより、複数のアクティビティを単一の通知エンベロープに 結合してもよい。

例 13:バッチ処理された通知
{
  "@context": [
    "https://www.w3.org/ns/lws/v1",
    "https://www.w3.org/ns/activitystreams"
  ],
  "type": "Notification",
  "storage": "https://storage.example/",
  "activity": [
    {
      "id": "a1b2c3d4-5678-9abc-def0-1234567890ab",
      "type": ["Create"],
      "object": {
        "id": "https://storage.example/alice/notes/meeting.txt",
        "type": ["DataResource"]
      },
      "target": "https://storage.example/alice/notes/",
      "published": "2026-03-26T10:30:00Z"
    },
    {
      "id": "b2c3d4e5-6789-abcd-ef01-234567890abc",
      "type": ["Update"],
      "object": {
        "id": "https://storage.example/alice/profile",
        "type": ["DataResource"]
      },
      "published": "2026-03-26T10:30:01Z"
    }
  ]
}

10.3 サブスクリプション

通知を受信するため、サブスクライバーは、 NotificationServiceのserviceEndpointに 認証済みのPOST要求を送信することにより、サブスクリプションを 作成する。要求本体はapplication/lws+jsonメディアタイプに 適合しなければならない。

10.3.1 サブスクリプション要求

サブスクリプション要求は、次のフィールドを含まなければならない:

  • type — 必須。サブスクリプションタイプを 識別する文字列。 値は、NotificationServiceの subscriptionType配列に列挙されたタイプのいずれかでなければ ならない。
  • topic — 必須。サブスクリプションに含まれる リソースを識別するURIの配列。

サブスクリプション要求には、具体的なサブスクリプションタイプによって必要とされる 追加のフィールドを含めてもよい。

例 14:サブスクリプション要求
POST /subscriptions HTTP/2
Host: notification.example
Authorization: Bearer <access-token>
Content-Type: application/lws+json

{
  "@context": ["https://www.w3.org/ns/lws/v1"],
  "type": "WebhookSubscription",
  "topic": [
    "https://storage.example/alice/notes/",
    "https://storage.example/alice/profile"
  ],
  "inbox": "https://receiver.example/hooks/lws"
}

10.3.2 サブスクリプションのスコープ

コンテナーに対するサブスクリプションは再帰的である。すなわち、サブスクライバーは、 コンテナー自体、およびそのコンテナーに推移的に包含されるすべてのリソースに関する 通知を受信する。データリソースに対するサブスクリプションは、その個別のリソースにのみ 適用される。

10.3.3 サブスクリプションの 認可

サーバーは、サブスクリプションを作成するとき、 リソースの認可を適用しなければならない。 サブスクライバーが、 topic配列に列挙されたすべてのリソースに対して読み取りアクセス相当の権限を 持たない場合、サーバーはサブスクリプション要求を拒否しなければ ならない。

認可は、通知の配信時にも適用されなければならない。サーバーは、 イベント発生時にサブスクライバーが読み取る権限を 持たないリソースに関する通知を配信しては ならない。これは、サブコンテナー内のリソースを含め、 サブスクリプションのスコープ内にあるすべてのリソースに 適用される。

サブスクリプションの作成後に、そのサブスクリプションのスコープ内の リソースまたはコンテナーに対するサブスクライバーのアクセス権が 取り消された場合、サーバーは、影響を受けるリソースに関する通知の配信を 停止しなければならない。サブスクライバーが topic配列内のすべてのリソースへのアクセス権を失っていない限り、 サーバーはサブスクリプション全体を終了しないことが 望ましい。

注記

サブスクリプション時の認可は、サブスクライバーが通知を受信する 正当な根拠を持つことを検証する。配信時の認可は、 サブスクリプションの作成後に発生し得る認可の変更を 考慮し、通知がサブスクライバーの現在の権限と 引き続き整合することを保証する。

10.3.4 サブスクリプション応答

サブスクリプション作成要求が成功した場合の応答は、 application/lws+jsonメディアタイプに適合しなければ ならず、次のフィールドを含まなければ ならない:

  • type — 必須。要求内のサブスクリプションタイプと 等しい文字列。
  • subscription — 必須。サブスクリプションを表す URL。

10.3.5 サブスクリプションタイプ 識別子

各通知スイートは、サブスクリプションタイプ文字列に 関連付けられなければならない。 サブスクリプションタイプ文字列は、NotificationServiceの subscriptionType配列、およびサブスクリプション要求の typeフィールドで使用される。

11. アクセス要求およびアクセス許可

アクセス要求およびアクセス許可は、エージェントがリソースへのアクセスを要求し、 ストレージコントローラーが定義済みの制約付きでアクセスを許可するためのメカニズムを提供します。 アクセスを要求および許可するためのエンドポイントは、特殊な受信箱の一種として機能します。

エージェントは、 アクセス許可を認可トークンとしてサーバーに提示しません。 むしろ、アクセス許可は、何が、誰に対して、 どのような制約の下で認可されたかを示す記録として機能します。アクセス許可が作成または取り消された(削除された)場合、 その変更を反映するように基盤となるアクセスポリシーを調整することは、 サーバーの責任です。アクセス許可エンドポイントと特定のポリシー 適用層との間の相互作用は、この仕様の範囲外です。

この節で定義するアクセスプロファイルは、 アクション、制約、譲受人など、 オープンデジタル権利言語(ODRL)の概念に基づいています。 他のプロファイルでは、異なる概念的枠組みを使用できます。

11.1 発見

ストレージは、アクセス要求および アクセス許可への対応を、 自身のストレージ記述リソースで通知してもよい。このような対応が 通知される場合、サービス オブジェクトで、アクセス要求用のエンドポイントを記述するものは、必須として、 typeが文字列AccessRequestServiceと等しくなければならず、 サービスオブジェクトで、アクセス許可用のエンドポイントを記述するものは、必須として、 次を持たなければならない: 文字列AccessGrantServiceと等しいtype。サービス オブジェクトは、conformsToプロパティを含むことが推奨される。その値は、 コレクションであり、 1つ以上のURIからなり、それらはアクセスプロファイルを識別する。その対応先は、 当該エンドポイントである。追加のプロパティを含めてもよい:

例 15: アクセス要求および許可のサービスを伴うストレージ 記述
{
  "@context": [
    "https://www.w3.org/ns/cid/v1",
    "https://www.w3.org/ns/lws/v1"
  ],
  "id": "https://storage.example/",
  "type": "Storage",
  "service": [
    {
      "type": "StorageRoot",
      "serviceEndpoint": "https://storage.example/root/"
    },
    {
      "type": "AccessRequestService",
      "serviceEndpoint": "https://access.example/request/",
      "conformsTo": ["https://www.w3.org/ns/lws#AccessProfile"]
    },
    {
      "type": "AccessGrantService",
      "serviceEndpoint": "https://access.example/grant/",
      "conformsTo": ["https://www.w3.org/ns/lws#AccessProfile"]
    }
  ]
}

11.2 データモデル

アクセス要求またはアクセス許可は、 アイデンティティおよびルーティングのためのプロパティと、要求または許可された操作を記述する accessオブジェクトを表現するデータオブジェクトである。ODRLの概念を使用して アクセス要求を記述するプロファイルについては、11.3 アクセスプロファイルで説明する。

次の例は、アクセス要求を示す。この例は、 11.4.1 JSON-LDシリアル化で定義されるJSON-LDシリアル化を使用して示されている。

例 16:アクセス要求
{
  "@context": [
    "https://www.w3.org/ns/lws/v1"
  ],
  "type": ["AccessRequest"],
  "inbox": "https://id.example/agent/inbox/",
  "storage": "https://storage.example/",
  "access": [{
    "type": ["AccessPolicy"],
    "action": ["read", "create"],
    "assignee": "https://id.example/agent",
    "target": {
      "type": "StorageResource",
      "value": ["https://storage.example/root/projects/"]
    },
    "constraint": [
      {
        "leftOperand": "purpose",
        "operator": "eq",
        "rightOperand": "https://purpose.example/collaboration"
      },
      {
        "leftOperand": "dateTime",
        "operator": "lteq",
        "rightOperand": "2026-06-09T10:00:00Z"
      }
    ]
  }]
}

次の例は、アクセス許可を示す。この例は、 11.4.1 JSON-LDシリアル化で定義されるJSON-LDシリアル化を使用して示されている。

例 17:アクセス許可
{
  "@context": [
    "https://www.w3.org/ns/lws/v1"
  ],
  "type": ["AccessGrant"],
  "storage": "https://storage.example/",
  "access": [{
    "type": ["AccessPolicy"],
    "action": ["read"],
    "assignee": "https://id.example/agent",
    "target": {
      "type": "StorageResource",
      "value": ["https://storage.example/root/projects/"]
    },
    "constraint": [
      {
        "leftOperand": "purpose",
        "operator": "eq",
        "rightOperand": "https://purpose.example/collaboration"
      },
      {
        "leftOperand": "dateTime",
        "operator": "lteq",
        "rightOperand": "2026-06-09T10:00:00Z"
      }
    ]
  }]
}

アクセス要求および アクセス許可には、他のプロパティが存在してもよい。

11.2.1 タイプ

typeプロパティは、文書のタイプを表す。

typeプロパティの値は、1つ以上の 用語および 絶対URL文字列でなければならない。 アクセス要求の場合、値には用語AccessRequestを 含めなければならない。 アクセス許可の場合、値には用語 AccessGrantを含めなければならない。 追加のタイプ値を含めてもよい。

このプロパティは必須である。

この文書では、アクセス要求および アクセス許可について、次のタイプ値を定義する:

例 18:typeプロパティ
{
  "type": ["AccessGrant"]
}

11.2.2 ストレージ

storageプロパティは、 アクセス要求またはアクセス許可の スコープとなるLWSストレージを識別する。

storageプロパティの値はURIでなければならない。

このプロパティは必須である。

例 19:storageプロパティ
{
  "storage": "https://storage.example/"
}

11.2.3 受信箱

inboxプロパティは、 アクセス要求またはアクセス許可に関連する 通知を受信するためのURIを指定する(11.6 通知を参照)。

inboxプロパティの値はURIでなければならない。

このプロパティは任意である。

例 20:inboxプロパティ
{
  "inbox": "https://id.example/agent/inbox/"
}

11.2.4 アクセス

accessプロパティは、サーバーによってサポートされるプロファイルに基づいて、 1つ以上のアクセスプロファイルの特性を記述する。 ODRL情報モデルに基づく プロファイルについては、11.3 アクセスプロファイルで説明する。

accessプロパティの値は、1つ以上の オブジェクトの集合でなければならない。

このプロパティは必須である。

11.3 アクセスプロファイル

この仕様は、 ODRL情報モデルおよびODRL 語彙に基づき、次のURLで識別される アクセスプロファイルを定義する: https://www.w3.org/ns/lws#AccessProfile。

11.3.1 タイプ

typeプロパティは、アクセス方針のタイプを表す。

typeプロパティの値は、1つ以上の 用語および 絶対URL文字列でなければならず、 用語AccessPolicyを含めなければならない。 追加のタイプ値を含めてもよい。

このプロパティは必須である。

例 21:アクセス方針タイプ
{
  "access": [{
    "type": ["AccessPolicy"]
  }]
}

11.3.2 アクション

actionプロパティは、エージェントが 実行することを希望する(要求の場合)、または実行することを認可されている(許可の場合) 操作を記述する。

actionプロパティの値は、1つ以上の 文字列の集合でなければならない。各値は、サーバーが認識する操作に 対応しなければならない。次の値をサポートしなければならない: read、modify、 create、およびdelete。read、 modify、およびdeleteの値は、 ODRL語彙によって定義される。 createの値は、この 仕様によって定義される。

これらのアクション値は、次のようにLWS操作に対応する:

  • read — リソースまたはそのメタデータを取得する(HTTP GET、HEAD)
  • modify — 既存のリソースを変更する(HTTP PUT、PATCH)
  • create — コンテナー内に新しいリソースを作成する(HTTP POST)
  • delete — 既存のリソースを削除する(HTTP DELETE)

このプロパティは必須である。

例 22:actionプロパティ
{
  "access": [{
    "action": ["read", "create"]
  }]
}

11.3.3 割当先

assigneeプロパティは、アクセスを要求している(要求の場合)、 またはアクセスを許可されている(許可の場合)主体を識別する。

assigneeプロパティの値はURIでなければならない。公開 アクセスは、URI http://xmlns.com/foaf/0.1/Agentによって識別される、FOAF 語彙のAgentクラスを使用して 割り当ててもよい。

このプロパティは必須である。

例 23:assigneeプロパティ
{
  "access": [{
    "assignee": "https://id.example/agent"
  }]
}

11.3.4 対象

targetプロパティは、 アクセス要求またはアクセス許可が 適用されるリソースを識別する。

targetプロパティは、次のプロパティを含むオブジェクトでなければ ならない:

  • type — 対象照合器のタイプを識別する 用語または 絶対URL文字列。
  • value — 対象リソースを識別するために使用される、 1つ以上の文字列の集合。

この仕様では、対象オブジェクトとともに使用する次の type値を定義する:

  • https://www.w3.org/ns/lws#DataResource — lws:DataResource 型の resource に一致する。
  • https://www.w3.org/ns/lws#Container — lws:Container 型の resource に一致する。
  • https://www.w3.org/ns/lws#StorageResource — あらゆる Storage Resource に一致する。

サーバーは追加の type 値をサポートしてもよい。

このプロパティは OPTIONAL である。

Example 24: StorageResource type を持つ target property の例
{
  "access": [{
    "target": {
      "type": "StorageResource",
      "value": [
        "https://storage.example/root/2025",
        "https://storage.example/root/2026"
      ]
    }
  }]
}

11.3.5 制約

constraintプロパティは、要求または許可されるアクセスを 制限または限定する条件を定義する。このプロパティは、ODRLの 制約モデルを使用する。

constraintプロパティの値が存在する場合、それは制約 オブジェクトの集合でなければならない。各制約オブジェクトは、次の プロパティを含まなければならない:

  • leftOperand — 制約されるオペランドを識別する文字列。
  • operator — 比較演算子を識別する文字列。
  • rightOperand — 比較対象となる値。タイプは leftOperandに依存する。

複数の制約オブジェクトが存在する場合、それらすべてを満たさなければ ならない。

このプロファイルのサポートを通知するサーバーは、次の leftOperand値をサポートしなければならない:

  • client — HTTP要求のクライアント識別子を表す
  • format — 対象HTTPリソースのメディアタイプを表す
  • type — リソースのリンクヘッダーで表現されるタイプURLを表す
  • purpose — 要求または許可されるアクセスの意図された用途を表す
  • dateTime — 現在の日時を表す

このプロパティは任意である。

次の例は、これらの制約の使用方法を示す:

11.3.5.1 目的の制約

次の例では、leftOperandの値として purposeを使用し、要求または許可されるアクセスの 意図された用途を記述する。eq演算子を使用する場合、 rightOperandの値は目的を識別するURIである。 isAnyOf演算子を使用する場合、rightOperandの 値は目的URIの配列であり、明示された目的が列挙された値のいずれかと 一致する場合に制約が満たされる:

例 25:目的の制約
{
  "access": [{
    "constraint": [
      {
        "leftOperand": "purpose",
        "operator": "isAnyOf",
        "rightOperand": [
          "https://purpose.example/collaboration",
          "https://purpose.example/research"
        ]
      }
    ]
  }]
}
11.3.5.2 クライアントの制約

次の例では、leftOperandの値として clientを使用し、アクセスを特定のクライアント アプリケーションに制限する。eq演算子を使用する場合、 rightOperandの値はクライアントを識別するURIである:

例 26:クライアントの制約
{
  "access": [{
    "constraint": [
      {
        "leftOperand": "client",
        "operator": "eq",
        "rightOperand": "https://app.example/client-id"
      }
    ]
  }]
}
11.3.5.3 形式制約

次の例では、leftOperandの値として formatを使用し、特定のメディアタイプを持つリソースに アクセスを制限します。eq演算子が使用される場合、 rightOperandの値は、 IANAメディアタイプを識別する文字列です。 isAnyOf演算子が使用される場合、rightOperandの値は メディアタイプ文字列の配列であり、リソースのメディアタイプが 列挙されたいずれかの値と一致すると、アクセスが許可されます。

例 27:形式制約
{
  "access": [{
    "constraint": [
      {
        "leftOperand": "format",
        "operator": "isAnyOf",
        "rightOperand": ["image/jpeg", "image/png"]
      }
    ]
  }]
}
11.3.5.4 リソースタイプの 制約

すべての Storage Resources は、type 値を示す link header を 含む。

次の例では、leftOperandの値として typeを使用し、HTTP Linkヘッダーで通知される リソースタイプに基づいてアクセスを制限する。 eq演算子を使用する場合、rightOperandの値は リソースタイプを識別するURIである。isAnyOf演算子を 使用する場合、rightOperandの値はタイプURIの配列であり、 リソースのタイプが列挙された値のいずれかと一致する場合にアクセスが 許可される:

例 29:リソースタイプの制約
{
  "access": [{
    "constraint": [
      {
        "leftOperand": "type",
        "operator": "isAnyOf",
        "rightOperand": [
          "https://type.example/Playlist",
          "https://type.example/Song"
        ]
      }
    ]
  }]
}
11.3.5.5 時間的制約

次の例では、leftOperandの値として dateTimeを使用し、アクセスを特定の時間枠に 制限する。gteq演算子は時間枠の開始を定義し、 lteq演算子は終了を定義する。時間的制約の rightOperandの値は、 XML SchemaのdateTime文字列である:

例 30:時間的制約
{
  "access": [{
    "constraint": [
      {
        "leftOperand": "dateTime",
        "operator": "gteq",
        "rightOperand": "2026-03-09T12:00:00Z"
      },
      {
        "leftOperand": "dateTime",
        "operator": "lteq",
        "rightOperand": "2026-06-09T10:00:00Z"
      }
    ]
  }]
}
11.3.5.6 制約の結合

複数の制約オブジェクトが存在する場合、アクセスを許可するには、 それらすべてを満たさなければならない。 次の例では、特定の日付より前におけるアクセスを、特定のクライアント アプリケーションに制限する:

例 31:結合された制約
{
  "access": [{
    "action": ["read"],
    "assignee": "https://id.example/agent",
    "target": {
      "type": "StorageResource",
      "value": ["https://storage.example/root/projects/"]
    },
    "constraint": [
      {
        "leftOperand": "dateTime",
        "operator": "lteq",
        "rightOperand": "2026-06-09T10:00:00Z"
      },
      {
        "leftOperand": "client",
        "operator": "eq",
        "rightOperand": "https://app.example/client-id"
      }
    ]
  }]
}

11.4 シリアル化

この節で定義するデータモデルは、特定の シリアル化に依存しない。

11.4.1 JSON-LDシリアル化

この仕様は、アクセス要求および アクセス許可のためのJSON-LDシリアル化を定義する。 このシリアル化を使用する文書は、 https://www.w3.org/ns/lws/v1を含む順序付き集合を値とする @contextプロパティを含めなければならない。 拡張用語を定義するために、追加のコンテキスト項目を含めてもよい。

このシリアル化に関連付けられたメディアタイプはapplication/lws+jsonである。

例 32:JSON-LD @context
{
  "@context": [
    "https://www.w3.org/ns/lws/v1"
  ]
}

11.5 プロトコル

アクセス要求およびアクセス許可の エンドポイントはLWSコンテナーであり、この仕様で定義される規則に 適合しなければならない。

これらのエンドポイントでは、最低限GETおよびPOST操作のサポートが必要である。 DELETE操作が推奨される。その他の操作をサポートしてもよい。

これらのエンドポイントは、要求および応答ペイロードの両方について、 11.4.1 JSON-LD シリアル化で定義されるJSON-LDシリアル化をサポートしなければならない。 サーバーは、追加のシリアル化をサポートしてもよい。

エージェントは、 アクセス要求エンドポイントに POST要求を送信することにより、アクセス要求を作成する。 ストレージ コントローラーは、アクセス許可エンドポイントに POST要求を送信することにより、アクセス許可を作成する。

成功したPOST操作は、Locationヘッダーを 新しいリソースのURLに設定して応答しなければならない。

11.5.1 アクセス要求エンドポイント

  • POST / — アクセス要求を作成する。
  • GET / — アクセス要求の一覧を取得する。
  • GET /:id — 特定のアクセス要求を取得する。
  • DELETE /:id — アクセス要求を取り消す。

11.5.2 アクセス許可エンドポイント

  • POST / — アクセス許可を作成する。
  • GET / — アクセス許可の一覧を取得する。
  • GET /:id — 特定のアクセス許可を取得する。
  • DELETE /:id — アクセス許可を取り消す。

11.6 通知

課題 103:LWS通知機能 work-item

この節は、まだ定義されていないLWSの通知節と整合させる必要がある。

通知は、エージェントおよびストレージ コントローラーに、 アクセス要求およびアクセス許可の変更について 通知するためのメカニズムを提供する。アクセス要求またはアクセス許可に inboxプロパティが存在する場合、サーバーは、割当先にイベントを通知するため、 そのエンドポイントに通知を配信することが望ましい。

通知のシリアル化は、LWS通知データモデルの要件に 適合しなければならない。

inboxエンドポイントに配信される通知は、通知配信について LWSプロトコルで定義される要件に適合しなければならない。

注記

この節で説明する通知メカニズムは、 Linked Data Notificationsパターンと同等である。 このパターンでは、通知はinboxプロパティを介して発見され、 その受信箱にPOST要求を送信することによって配信される。

11.6.1 通知イベント

サーバーは、次のイベントに応じて通知を送信することが望ましい:

サーバーは、その他のイベントに応じて通知を送信してもよい。

12. LWS メディアタイプ

12.1 LWS メディアタイプ

LWS のストレージ記述は必ずメディアタイプapplication/lws+cidでシリアライズ可能でなければならない。 application/lws+cidメディアタイプは、 W3Cの制御識別子文書[CID-1.0]を LWS 語彙で拡張した特化文書を識別する。

LWS のコンテナー表現は必ずメディアタイプapplication/lws+jsonをサポートしなければならない。

LWS のコンテナー表現は JSON-LD の規約を使用するが、LWS に固有の制約と要件により、 専用のメディアタイプを使用することが正当化される。

12.1.1 LWS プロファイル

URI https://www.w3.org/ns/lws/v1はLWS プロファイル[RFC6906]を識別する。コンテナーの表現がLWS プロファイルに適合するのは、 同じコンテナーの状態とページのapplication/lws+json表現と RDF 同型である場合である。すなわち、エンコードされた RDF が、 RDF データセットの 比較[RDF12-CONCEPTS]で定義されるように、 application/lws+json表現を JSON-LD として解釈したときにエンコードされる RDF と同型である場合である[JSON-LD11]。application/lws+json 表現は常にLWS プロファイルに適合する。

12.1.2 コンテンツネゴシエーション

サーバーは必ずコンテナーに対するapplication/lws+jsonの要求に応じ、 必ず応答のContent-Typeヘッダーを選択された表現のメディアタイプに設定しなければならない。

クライアントは、RDF メディアタイプのprofileパラメーターにLWS プロファイルの URI を含めることで、 LWS プロファイルに適合する表現を要求する。 このパラメーターを定義する RDF メディアタイプには、application/ld+json [JSON-LD11]、text/turtle[RDF12-TURTLE]、application/trig[RDF12-TRIG]、application/n-triples[RDF12-N-TRIPLES]、およびapplication/n-quads [RDF12-N-QUADS]がある。サーバーがそのようなメディアタイプを選択した場合、 応答は必ずLWS プロファイルに適合しなければならない。 つまり、application/lws+json表現と必ずRDF 同型でなければならず、 そのContent-Typeには必ず同じ profileパラメーターを含めなければならない。サーバーは、そのメディアタイプで LWS プロファイルに適合する表現を生成できない場合、 そのメディアタイプを選択してはならない。

選択される表現が要求のAcceptヘッダーに依存する場合、応答には原則としてVary: Acceptヘッダーを含めるべきである[RFC9110]。

12.1.3 ページネーション

コンテナーなどの一部の複合リソースには、多数のリソースが含まれる場合がある。 クライアントが一覧を段階的に取得できるようにするため、サーバーは原則として、 メンバー数がサーバーによって決定されたしきい値を超えるコンテナーについて、ページネーションをサポートすべきである。

12.1.3.1 ページネーションモデル

ページネーションはリンクベースである。サーバーは HTTP のLinkヘッダーを通じてページネーション用 URI を提供し [RFC8288]、 クライアントが数値オフセットに依存せずに一覧全体をたどれるようにする。

一覧がページ分割されている場合、応答本文には現在のページの項目のみが含まれる。 複合リソースのid、type、totalItemsプロパティは メンバー全体を反映する一方、itemsには 現在のページのリソースのみが含まれる。

12.1.3.3 ページの要求

クライアントは最初のページを取得するために複合リソースの URI を要求する。応答には ページネーション用の Link ヘッダーが含まれ、クライアントはこれに従って後続のページを取得する。サーバーは任意で、 以前の走査で取得したページネーション用 URI を介して特定のページへの直接アクセスもサポートしてよい。

ページ分割された応答が返される場合、サーバーは必ず200 OK で応答しなければならない。応答本文のtotalItems プロパティは原則として現在のページだけでなく、すべてのページにわたる項目の総数を 反映すべきである。

12.1.3.4 例: ページ分割されたコンテナー

要求:

GET /alice/photos/ HTTP/1.1
Authorization: Bearer <token>
Accept: application/lws+json

応答(最初のページ):

HTTP/1.1 200 OK
Content-Type: application/lws+json
ETag: "photos-page1-etag"
Link: </alice/photos/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
Link: </alice/photos/?page=1>; rel="first"
Link: </alice/photos/?page=3>; rel="last"
Link: </alice/photos/?page=2>; rel="next"

{
  "@context": "https://www.w3.org/ns/lws/v1",
  "id": "/alice/photos/",
  "type": "Container",
  "totalItems": 150,
  "items": [
    {
      "type": "DataResource",
      "id": "/alice/photos/vacation.jpg",
      "format": "image/jpeg",
      "size": 248392,
      "modified": "2025-11-20T10:30:00Z"
    },
    {
      "type": "DataResource",
      "id": "/alice/photos/portrait.png",
      "format": "image/png",
      "size": 102400,
      "modified": "2025-11-21T14:15:00Z"
    }
  ]
}

要求(次のページ):

GET /alice/photos/?page=2 HTTP/1.1
Authorization: Bearer <token>
Accept: application/lws+json

応答(中間のページ):

HTTP/1.1 200 OK
Content-Type: application/lws+json
ETag: "photos-page2-etag"
Link: </alice/photos/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
Link: </alice/photos/?page=1>; rel="first"
Link: </alice/photos/?page=1>; rel="prev"
Link: </alice/photos/?page=3>; rel="next"
Link: </alice/photos/?page=3>; rel="last"

{
  "@context": "https://www.w3.org/ns/lws/v1",
  "id": "/alice/photos/",
  "type": "Container",
  "totalItems": 150,
  "items": [
    {
      "type": "DataResource",
      "id": "/alice/photos/sunset.jpg",
      "format": "image/jpeg",
      "size": 315000,
      "modified": "2025-11-22T09:00:00Z"
    }
  ]
}

13. JSON-LD コンテキスト

LWS JSON-LD コンテキストは、URL https://www.w3.org/ns/lws/v1 によって識別される。 その URL から解決される文書の SHA2-256 ダイジェストを、次の表に示す。

コンテキスト URL とハッシュ
URL: https://www.w3.org/ns/lws/v1
SHA2-256 ダイジェスト: TODO:コンテキスト文書が確定したら JSON-LD コンテキストのダイジェストを含める

ダイジェストは、次のようなコマンドで検証できる。 curl -sL -H "Accept: application/ld+json" https://www.w3.org/ns/lws/v1 | openssl dgst -sha256

注記
本番システムでは、実行時にリモートの JSON-LD コンテキスト文書を取得しないことが推奨される。 コンテキストをローカルにバンドルまたはキャッシュすることで、外部 インフラストラクチャへの実行時依存がなくなり、レイテンシーが低減され、コンテキスト操作攻撃を防止できる。

14. リソース識別

URIスキーム、リソース命名規約、および解決メカニズムを含め、LWSプロトコル内で リソースがどのように識別され、アドレス指定されるかを定義する。この節は、 別の節(例:リソースアクセス)内に移動される可能性がある

これは意図的に空白のままとしている

15. 移植性に関する考慮事項

相互運用性を維持しながら、LWS実装が異なるプラットフォーム、 環境、およびストレージバックエンド間で動作できるようにするための考慮事項を説明し、 ストレージプロバイダーの変更を可能にする操作手段を提供する

これは意図的に空白のままとしている

16. セキュリティに関する考慮事項

この節は非規範的である。

脅威モデル、セキュリティ要件、および安全なLWS展開のための 実装ガイダンスを扱う正式なセキュリティ考慮事項の節。

OAuth 2.0セキュリティの現行ベストプラクティス[RFC9700]で説明される推奨事項は、この 仕様に適用される。

16.1 トランスポートのセキュリティ

この節は非規範的である。

Transport Layer Security(TLS)は、改ざん、なりすまし、および 情報漏えいを防ぐための重要な仕組みである。TLSで保護された通信は、[RFC6125]に従って検証できる。 実装上のセキュリティに関する考慮事項は、「トランスポート 層セキュリティ(TLS)およびデータグラムトランスポート層セキュリティ(DTLS)の安全な使用に関する推奨事項」[RFC9325]を参照。

16.2 トークンのセキュリティ

この節は非規範的である。

Bearerトークンおよびデジタル資格情報は、盗難やリプレイに対して脆弱である。緩和策には、 適度に短い有効期間の使用、特定の対象者へのトークンのバインディング、およびトークンの安全な保存が含まれる。

16.3 リソースの検出

この節は非規範的である。

クライアントは、ストレージサーバーから送信されたレスポンスから認可サーバーの場所を知るが、そのストレージサーバーを クライアントは、 信頼していない可能性がある。この検出プロセスには、以下の考慮事項が適用される。

16.4 アクセス要求と許可

この節は非規範的である。

16.5 通知

この節は非規範的である。

17. プライバシーに関する考慮事項

この節は非規範的である。

データ最小化、ユーザーの同意、およびプライバシーを保護する 実装パターンを含む、LWSプロトコルのプライバシーへの影響。

クレデンシャルは、ユーザーおよびエージェントに関する情報を保持する。デジタル署名は改ざんを防止できるが、 クライアントまたは第三者が暗号化されていないクレデンシャル内の値を読み取ることは可能である。

そのため、クレデンシャル発行者には、認証または認可に必要な情報のみを含むトークンを作成し、 必要でない限り機密性の高い属性を含めないことが推奨される。

一般に、暗号化されていないクレデンシャルデータをログに書き込むことはアンチパターンである。 これが必要な場合、実装はクレデンシャルを切り詰めるかハッシュ化して、 クレデンシャル主体のプライバシーを保護できる。

JWTで仮名識別子を使用する場合でも、ストレージサーバーは、同一のエージェントからの要求を 時間の経過にわたって関連付けられる可能性がある。 この場合にユーザーのプライバシーを保護するため、クライアントアプリケーションは、 各JWTが一度だけ使用されるJWTの一括発行を要求できる。 これは、ストレージサーバーがJWTの内容の類似性や送信元IPアドレスなどの他の情報を使用して 要求を関連付けることを防止しない。仮名識別子を使用する場合、認可サーバーは、 同じ識別子を複数回発行しないよう注意する必要がある。

17.1 アクセス要求およびアクセス許可

この節は非規範的である。

17.2 通知

この節は非規範的である。

18. IANAに関する考慮事項

この節は非規範的である。

18.1 well-known URIレジストリ

この仕様は、RFC 5785 [RFC5785]によって確立された 「Well-Known URIs」レジストリに、 次の値を追加する。

18.2 OAuth 認可サーバーメタデータレジストリ

この仕様は、[RFC8414]によって確立された 「OAuth Authorization Server Metadata」レジストリに、 次の値を追加する。

18.3 application/lws+jsonメディアタイプ

この仕様は、Linked Web Storageコンテナー形式に適合する文書を 識別するために、application/lws+jsonメディアタイプを登録する。

Linked Web Storage形式はJSON-LDの規約を使用するが、LWS実装には、 固有のメディアタイプを使用することを正当化する多数の制約および追加要件があることに注意されたい。

18.4 application/lws+cid メディアタイプ

本仕様は、Linked Web Storage プロトコルに適合するストレージ記述文書を、 W3C Controlled Identifiers 1.0 文書形式を特殊化したものとして識別するための application/lws+cid メディアタイプを登録する。

A. 謝辞

この節は非規範的である。

この仕様は、Solid Protocol [Solid-Protocol]に大きく依拠している。同プロトコルは、長期間にわたり Sarven Capadisli、Tim Berners-Lee、Kjetil Kjernsmo、Ruben Verborgh、Justin Bingham、Dmitri Zagidulinによって編集された。

B. 参考文献

B.1 規範的参考文献

[ACTIVITYSTREAMS-CORE]
Activity Streams 2.0. James Snell; Evan Prodromou. W3C. 2017年5月23日. W3C 勧告. URL: https://www.w3.org/TR/activitystreams-core/
[ACTIVITYSTREAMS-VOCABULARY]
Activity 語彙. James Snell; Evan Prodromou. W3C. 2017年5月23日. W3C 勧告. URL: https://www.w3.org/TR/activitystreams-vocabulary/
[CID-1.0]
制御識別子 v1.0. Michael Jones; Manu Sporny. W3C. 2025年5月15日. W3C 勧告. URL: https://www.w3.org/TR/cid-1.0/
[FOAF]
FOAF 語彙仕様 0.99(パディントン 版). Dan Brickley; Libby Miller. FOAF プロジェクト. 2014年1月14日. URL: http://xmlns.com/foaf/spec/
[JSON-LD11]
JSON-LD 1.1. Gregg Kellogg; Pierre-Antoine Champin; Dave Longley. W3C. 2020年7月16日. W3C 勧告. URL: https://www.w3.org/TR/json-ld11/
[ODRL-MODEL]
ODRL 情報モデル 2.2. Renato Iannella; Serena Villata. W3C. 2018年2月15日. W3C 勧告. URL: https://www.w3.org/TR/odrl-model/
[ODRL-VOCAB]
ODRL 語彙と表現 2.2. Renato Iannella; Michael Steidl; Stuart Myles; Víctor Rodríguez-Doncel. W3C. 2018年2月15日. W3C 勧告. URL: https://www.w3.org/TR/odrl-vocab/
[OPENID-CONNECT-CORE]
OpenID Connect Core 1.0 正誤表セット 2 を反映. N. Sakimura; J. Bradley; M. Jones; B. de Medeiros; C. Mortimore. OpenID Foundation. 2023年12月15日. 最終版. URL: https://openid.net/specs/openid-connect-core-1_0.html
[RDF12-CONCEPTS]
RDF 1.2 の概念と抽象データ モデル. Andy Seaborne; Gregg Kellogg; Olaf Hartig; Pierre-Antoine Champin. W3C. 7 4月 2026年. W3C 勧告候補. URL: https://www.w3.org/TR/rdf12-concepts/
[RDF12-N-QUADS]
RDF 1.2 N-Quads. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026年10月10日. W3C 作業草案. URL: https://www.w3.org/TR/rdf12-n-quads/
[RDF12-N-TRIPLES]
RDF 1.2 N-Triples. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/rdf12-n-triples/
[RDF12-TRIG]
RDF 1.2 TriG. Gregg Kellogg; Dominik Tomaszuk. W3C. 2026年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/rdf12-trig/
[RDF12-TURTLE]
RDF 1.2 Turtle. Gregg Kellogg; Andy Seaborne; Dominik Tomaszuk. W3C. 2026年10月7日. W3C 作業草案. URL: https://www.w3.org/TR/rdf12-turtle/
[RFC2119]
RFC で用いるキーワードによる 要件レベルの表示. S. Bradner. IETF. 1997年3月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC3339]
インターネット上の日付と時刻: タイムスタンプ. G. Klyne; C. Newman. IETF. 2002年7月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc3339/
[RFC3986]
統一資源識別子 (URI): 汎用 構文. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005年1月. インターネット 標準. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC4918]
Web 分散 オーサリングとバージョン管理 (WebDAV) のための HTTP 拡張. L. Dusseault, 編. IETF. 2007年6月. 標準化 提案. URL: https://www.rfc-editor.org/info/rfc4918/
[RFC5789]
HTTP の PATCH メソッド. L. Dusseault; J. Snell. IETF. 2010年3月. 標準化提案. URL: https://httpwg.org/specs/rfc5789.html
[RFC6749]
OAuth 2.0 認可 フレームワーク. D. Hardt, 編. IETF. 2012年10月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc6749/
[RFC6750]
OAuth 2.0 認可フレームワーク: Bearer トークンの使用. M. Jones; D. Hardt. IETF. 2012年10月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc6750/
[RFC6902]
JavaScript オブジェクト表記 (JSON) パッチ. P. Bryan, 編; M. Nottingham, 編. IETF. 2013年4月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc6902/
[RFC6906]
「profile」リンク関係 タイプ. E. Wilde. IETF. 2013年3月. 情報提供. URL: https://www.rfc-editor.org/info/rfc6906/
[RFC7231]
ハイパーテキスト転送プロトコル (HTTP/1.1): セマンティクスと内容. R. Fielding, 編; J. Reschke, 編. IETF. 2014年6月. 標準化提案. URL: https://httpwg.org/specs/rfc7231.html
[RFC7233]
ハイパーテキスト転送プロトコル (HTTP/1.1): 範囲 要求. R. Fielding, 編; Y. Lafon, 編; J. Reschke, 編. IETF. 2014年6月. 標準化提案. URL: https://httpwg.org/specs/rfc7233.html
[RFC7240]
HTTP 用 Prefer ヘッダー. J. Snell. IETF. 2014年6月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc7240/
[RFC8174]
大文字と小文字の違いに関する曖昧さ(RFC 2119 のキーワード). B. Leiba. IETF. 2017年5月. 現行のベストプラクティス. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC8288]
Web リンク. M. Nottingham. IETF. 2017年10月. 標準化提案. URL: https://httpwg.org/specs/rfc8288.html
[RFC8414]
OAuth 2.0 認可サーバーの メタデータ. M. Jones; N. Sakimura; J. Bradley. IETF. 2018年6月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc8414/
[RFC8693]
OAuth 2.0 トークン交換. M. Jones; A. Nadalin; B. Campbell, 編; J. Bradley; C. Mortimore. IETF. 2020年1月. 標準化 提案. URL: https://www.rfc-editor.org/info/rfc8693/
[RFC9068]
JSON Web Token (JWT) による OAuth 2.0 アクセストークンのプロファイル. V. Bertocci. IETF. 2021年10月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9068/
[RFC9110]
HTTP セマンティクス. R. Fielding, 編; M. Nottingham, 編; J. Reschke, 編. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9110.html
[rfc9112]
HTTP/1.1. R. Fielding, 編; M. Nottingham, 編; J. Reschke, 編. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9112.html
[RFC9264]
Linkset: メディアタイプおよび リンクセット用のリンク関係タイプ. E. Wilde; H. Van de Sompel. IETF. 2022年7月. 標準化 提案. URL: https://www.rfc-editor.org/info/rfc9264/
[RFC9457]
HTTP API の問題詳細. M. Nottingham; E. Wilde; S. Dalal. IETF. 2023年7月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9457/
[RFC9728]
OAuth 2.0 保護対象リソースの メタデータ. M.B. Jones; P. Hunt; A. Parecki. IETF. 2025年4月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9728/
[URL]
URL 標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/
[WebArch]
ワールドワイドウェブのアーキテクチャ、第 1巻. Ian Jacobs; Norman Walsh. W3C. 2004年12月15日. W3C 勧告. URL: https://www.w3.org/TR/webarch/
[XMLSCHEMA11-2]
W3C XML スキーマ定義言語 (XSD) 1.1 第2部: データ型. David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron ほか. W3C. 2012年4月5日. W3C 勧告. URL: https://www.w3.org/TR/xmlschema11-2/

B.2 参考情報文献

[LDN]
Linked Data Notifications。Sarven Capadisli; Amy Guy. W3C. 2017年5月2日。W3C勧告。URL:https://www.w3.org/TR/ldn/
[RFC5785]
Well-Known統一資源 識別子(URI)の定義。M. Nottingham; E. Hammer-Lahav. IETF. 2010年4月。標準化 提案。URL:https://www.rfc-editor.org/info/rfc5785/
[RFC6125]
Transport Layer Security(TLS)のコンテキストにおいて X.509(PKIX)証明書を使用するインターネット公開鍵基盤内の ドメインベースアプリケーションサービスアイデンティティの表現および検証。P. Saint-Andre; J. Hodges. IETF. 2011年3月。標準化提案。URL:https://www.rfc-editor.org/info/rfc6125/
[RFC8259]
JavaScript Object Notation(JSON)データ 交換形式。T. Bray, Ed. IETF. 2017年12月。インターネット標準。URL:https://www.rfc-editor.org/info/rfc8259/
[RFC9325]
Transport Layer Security(TLS)およびDatagram Transport Layer Security(DTLS)の安全な使用に関する推奨事項。Y. Sheffer; P. Saint-Andre; T. Fossati. IETF. 2022年11月。現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc9325/
[RFC9449]
OAuth 2.0 所有証明の提示 (DPoP). D. Fett; B. Campbell; J. Bradley; T. Lodderstedt; M. Jones; D. Waite. IETF. 2023年9月. 標準化提案. URL: https://www.rfc-editor.org/info/rfc9449/
[RFC9700]
OAuth 2.0 セキュリティの現行ベストプラクティス。T. Lodderstedt; J. Bradley; A. Labunets; D. Fett. IETF. 2025年1月。 現行のベストプラクティス。URL:https://www.rfc-editor.org/info/rfc9700/
[Solid-Protocol]
Solidプロトコル。Sarven Capadisli; Tim Berners-Lee; Kjetil Kjernsmo. Solidコミュニティグループ。2024年5月12日。コミュニティグループ報告書案。 URL:https://solidproject.org/TR/protocol