Linked Web Storageプロトコル 1.0

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-lws10-core-20260821/
最新公開バージョン:
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 適合性

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

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

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

LWS クライアントは、この仕様における関連するすべての「MUST」文に適合するHTTPクライアント[rfc9112]である。具体的には、この文書の9. 操作における関連する規範的な 「MUST」文を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)応答を生成するストレージサーバーは、少なくとも1つの適合するチャレンジを含む WWW-Authenticateヘッダー フィールドを送信しなければMUSTならない。適合するチャレンジは、 以下に記述するパラメーターを含む:

  • as_uri REQUIRED — この パラメーターの値は、クライアントがアクセストークンを取得できる認可サーバーを識別するURIである。 このパラメーターの値は、有効なアクセストークンの issクレームと同じである。
  • realm REQUIRED — この パラメーターの値は、保護の範囲を示すURIである。 この値は、アクセストークンのオーディエンス(aud)クレームに含まれる。 クライアントは、 送信元要求のURIが、この応答で提示されたrealm内に論理的に含まれていることを 検証しなければMUSTならない。

他のヘッダーおよびパラメーターが含まれてもMAYよい。

401応答の例を以下に示す。

HTTP/2 401 Unauthorized
Link: <https://storage.example/storage_1>; rel="https://www.w3.org/ns/lws#storage"
WWW-Authenticate: Bearer as_uri="https://authorization.example",
                realm="https://storage.example/storage_1",
                error="invalid_token"

5.2.2 認可サーバー メタデータ

認可サーバーは、[RFC8414]に記述されるように、 クライアントがエンドポイントの場所および機能を発見できるようにするメタデータリソースを提供しなければMUSTならない。 このメタデータリソースは、 /.well-known/lws-configurationというパスを持つURLで利用可能でなければMUSTならない。

認可サーバーは、サーバーメタデータ文書にsubject_token_types_supported エントリーを含めることによって、サポートするサブジェクトトークンを広告すべきSHOULDである。 このエントリーは、認可サーバーのトークンエンドポイントで指定できる有効な subject_token_type値の一覧を含むJSON配列である。

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

{
    "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"]
}

5.2.3 トークン交換

LWS認可サーバーは、ストレージサーバーで使用するための アクセストークンをクライアントに発行できる、適合するOAuth 2.0認可サーバーである。 アクセストークンを発行するために、クライアントはまず、 認証資格情報などの有効なサブジェクトトークンを、 OAuth 2.0 Token Exchange [RFC8693]を介して 認可サーバーに提示しなければならない。

5.2.3.1 要求

認可サーバーのトークンエンドポイントは、OAuth 2.0 Token Exchange [RFC8693]で記述される、 urn:ietf:params:oauth:grant-type:token-exchange グラント型をサポートしなければMUSTならない。

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

  • resourceパラメーターはREQUIREDである。この パラメーターの値はURIでなければMUSTならず、結果として得られるアクセストークン内の aud(オーディエンス)クレームを設定するために使用される。指定された値は、 WWW-Authenticateチャレンジにおける realmパラメーター応答と同じである。 認可サーバーは、 resourceパラメーターが不明または信頼されていないストレージを識別する要求を拒否しなければMUSTならない。
  • subject_tokenパラメーターはREQUIREDである。この パラメーターの値は、 認証 資格情報などの有効なサブジェクトトークンを含まなければMUSTならない。
  • クライアントにアクセストークンを返す前に、認可サーバーは提示されたすべてのトークンを正常に検証しなければMUSTならない。

トークン要求の非規範的な例(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.3.2 応答

トークン要求が有効であり、クライアントがその要求を行うことを認可されている場合、 認可サーバー応答は、OAuth 2.0 Authorization Framework [RFC6749]の第5.1節に 適合しなければMUSTならない。結果として得られるアクセストークンは、 JSON Web Token Profile for OAuth 2.0 Access Tokens [RFC9068]に 適合しなければMUSTならない。

さらに、アクセストークンは次の要件を満たさなければならない:

  • sub(主体)— REQUIRED。このクレームは、 操作を実行するエージェントを識別するURIでなければMUSTならない
  • iss(発行者)— REQUIRED。このクレームは、 認可サーバーのURIでなければMUSTならない
  • client_id(クライアントID)— REQUIRED。 このクレームは、クライアントを識別するURIでなければMUSTならない。
  • aud(オーディエンス)— REQUIRED。このクレームは、 resourceパラメーターでクライアントにより指定されたURIを含まなければMUSTならない。 この値は、アクセストークンが有効となる実体を制限するために使用される。これは、 ストレージサーバーがWWW-Authenticateチャレンジのrealmパラメーターで提供する値と 同じ値になる。
  • exp(有効期限)— REQUIRED。 認可サーバーは、トークン窃取による露出を制限するため、短い存続期間のトークン (RECOMMENDED: 300秒以下)を発行すべきSHOULDである。
  • iat(発行時刻)— REQUIRED
  • jti(JWT ID)— REQUIRED

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

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

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

無効または未認可のすべての要求は、OAuth 2.0 Authorization Framework [RFC6749]の第5.2節に 記述されるエラー応答にならなければMUSTならない。

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

{
    "error":"invalid_request"
}
5.2.3.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",
  "exp": 1735686300,
  "iat": 1735686000,
  "jti": "550e8400-e29b-41d4-a716-446655440000"
}
.
signature

5.2.4 ストレージサーバー によるトークン検証

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

5.2.4.1 提示

クライアントは、[RFC6750]で定義される認証スキームを用いて、 Authorizationヘッダーによりアクセストークンをストレージサーバーに提示しなければMUSTならない。

Authorization: Bearer eyJ0eXAiOiJhcytqd3QiLCJhbGciOiJFUzI1NiIs...DeWt4QuZXso
5.2.4.2 検証

ストレージサーバーは、次の検査を実行し、いずれかが失敗した場合には要求を拒否することによって、 アクセストークンを検証しなければMUSTならない:

  • JWT署名検証: 認可サーバーメタデータで指定された jwks_uriから取得した認可サーバーの公開鍵を用いてJWT署名を検証する。 ストレージサーバーは、これらの鍵をキャッシュすべきSHOULDであり、 鍵ローテーションをサポートしなければMUSTならない。
  • 発行者検証: issクレームが想定される認可サーバー識別子と一致することを検証する。
  • オーディエンス検証: audクレームが正確に1つの値を含み、この 値が対象リソースを論理的に含むストレージサーバーを識別するURIであることを検証する。
  • システム間で許容されるクロックスキューを前提とした時間検証。
    • 現在時刻がexp(有効期限)クレームより前であることを検証する。
    • nbf(not before)クレームが存在する場合、現在時刻がそれより前でないことを検証する。
    • iat(発行時刻)クレームが未来でないことを検証する。

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

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

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 プロパティは必須である。その値はサービスの集合でなければならず、 各サービスは次のプロパティを含むマップによって記述される。追加の プロパティが存在してもよい。 この集合には、typeStorageRoot と等しいサービスが含まれなければならない
    • id - id プロパティは任意である。存在する場合、その値は URI でなければならない
    • type - type プロパティは必須である。その値は文字列 または文字列の集合でなければならない
    • serviceEndpoint - serviceEndpoint プロパティは必須である。その値は URI でなければならない
8: 最小限のストレージ記述リソース
{
  "@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要求に対するすべての応答は、必ずストレージの正規URIをターゲットとし、値がhttps://www.w3.org/ns/lws#storageと等しい関係 (rel)パラメーターを含む Linkヘッダーを含めなければなりません。

ストレージURIに対する要求は、コンテントネゴシエーションによって異なる形式が要求されない限り、 メディアタイプがapplication/lws+cidである ストレージ記述リソースデータモデルに 準拠する文書を必ず返さなければなりません。

6.1.3 ストレージ機能

ストレージ記述には、 ストレージによってサポートされる追加のケイパビリティの記述が含まれる場合があります。

6.1.4 ストレージサービス

ストレージ記述リソースには、必ずserviceEndpointストレージルートコンテナーのURIである StorageRootサービスが含まれなければなりません。 ストレージに接続された追加のサービスも存在してもよいものとします。 これらの追加サービスのAPI定義は、この仕様の範囲外です。

6.1.5 ストレージ 記述表現

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

9: ストレージ記述リソース
{
  "@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/merge-patch+json", "application/json-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 コンテナモデル

リンクトウェブストレージは、リソースをコンテナーに編成します。コンテナーは、 メンバーと呼ばれる他のリソースへの参照を保持する特殊なリソースです。コンテナーは、 ディレクトリーやコレクションに類似した編成単位として機能し、クライアントがリソースをグループ化、検出、 およびナビゲートできるようにします。コンテナーは、そのメンバーリソースへの参照を維持します。 メンバーリソースには、非コンテナーリソースと追加のコンテナーリソースの両方を含めることができ、それによって 階層構造を形成できます。通常、コンテナーが保持する固有の内容は、 メタデータまたはそのメンバーの列挙を除けば最小限であり、その主な役割は、下位のリソースを集約して 構造化することです。ストレージシステムのルートは、上位の親を持たない 最上位の編成単位として機能するコンテナーとして指定されます。コンテナー表現の構造は、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 コンテナ表現

クライアントが コンテナーを取得すると、サーバーは、その コンテナーおよびその内容を記述する、構造化された コンテナー表現を返す。この節では、コンテナー表現の必須および オプションのプロパティを定義する。

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 コンテナ 表現の例

次の例は、2つのリソースを含む/alice/notes/にあるコンテナを示している:

{
  "@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)サーバーがサポートしなければMUSTならない4つの中核操作を定義する。これらの操作は、リソースおよびコンテナを トランスポート非依存の方法で操作し、実装の詳細ではなく意味論に焦点を当てる。各操作は、 入力、期待される振る舞い、および可能な応答を指定する。応答には、成功インジケーター、リソース 表現(該当する場合)、およびエラー条件が含まれる。実装は、これらの操作を原子的かつ一貫して処理しなければMUST ならない。つまり、各操作は完全に成功するか、部分的な副作用なしに失敗する。エラーの場合、応答は、 機密情報を漏えいすることなく問題をエージェントが理解できる十分な詳細を提供すべきSHOULDである。

各中核操作(作成、読み取り、更新、削除)について、使用するHTTPメソッド、必須の ヘッダーまたは特別な考慮事項(ETagによる同時実行制御、コンテンツネゴシエーション、および コンテナ一覧のページネーションを含む)、ならびにサーバーが行い返すべき内容を記述する。標準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 メタデータ

この節では、メタデータをLWSリソースに関連付けるためのモデルを定義します。 LWSメタデータシステムは、型付きリンクを使用してサーバーがリソース間の関係を記述できる ウェブリンク [RFC8288] の原則に基づいています。 メタデータは検出可能性を高め、自己記述型APIをサポートし、リソース操作およびコンテナー階層と整合します。

メタデータモデル LWS内のすべてのメタデータは、リソース(リンクコンテキスト)を起点とする型付きリンクの集合として表現されます。 各リンクは、次の要素で構成されます。

メタデータはリソースとその表現を区別し、該当する場合には複数のメディアタイプを 使用できるようにします。データリソースの場合、メタデータには表現が含まれ、各表現は formatおよび任意のsizeInBytesを持ちます。コンテナーおよびデータリソースでは、親コンテナーリソースへのリンクを、そのリソースのメタデータの一部と見なします。

リンクセットリソース ストレージ内の各リソースについて、サーバーは必ずメタデータリンクを、 [RFC9264]に従って独立したリソースとして利用可能にしなければなりません。

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

メタデータの種類

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

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

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

  2. パッチ形式の検出:サーバーは、Accept-Patchヘッダーを介してJSONマージ パッチ [RFC7386] のサポートを必ず通知しなければなりません。 Accept-Patch: application/merge-patch+json

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

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

メタデータの管理 メタデータは、リソースに関連付けられたリンクセットリソース URIとやり取りすることによって管理されます。サーバーは、更新の同時実行制御を必ずサポートしなければなりません。

9.2 リソースを作成する

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

入力:

振る舞い:

可能な応答:

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

成功時、サーバーは、Locationヘッダーに新しいURIを指定して、201ステータスコードを必ず返さなければなりません。 サーバーは、親コンテナーへのリンク (rel="up")や、作成されたリソース専用のリンクセットリソースへのリンク (rel="linkset"; type="application/linkset+json")を含む、主要なサーバー管理メタデータ用の Linkヘッダーを必ず含めなければなりません。追加のリンクには、原則として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の内容(買い物リスト)を提供し、新しいリソースの名前として shoppinglist.txtを提案します。/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

成功時には、Locationヘッダーに新しいURIを指定して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/に新しいコンテナーが作成され、サーバーによって生成される メタデータには、https://www.w3.org/ns/lws#Containerとしてのrel="type"が含まれます。

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

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

9.3 リソースを読み取る

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

リソースを読み取る操作は、HTTP GET要求(およびヘッダーのみの要求のためのHEAD)で リソース表現を要求する。振る舞いは、対象URLがコンテナであるか、非コンテナリソース(データリソース)であるかにより異なる。サーバーはメタデータを介して リソース型を区別しなければMUSTならない。すべての応答は、 rel="linkset"rel="up"、およびrel="type"などの主要な関係のLinkヘッダーを含め、 第8.1節で定義されるメタデータと統合されなければMUSTならない。サーバーは、読み取り中にリソース状態とそのメタデータとの原子性を保証しなければMUSTならない。

GET(非コンテナリソース)リソースのコンテンツを取得: 完全なコンテンツ(認可されている場合)を得るために、リソースURIへGETを送信する。200 OKで応答し、本文には データを含め、Content-Typeは保存されたメディア型に一致する。サーバーは、部分 取得のために[RFC7233]に従う範囲要求をサポートしなければMUSTならない。応答は、同時実行制御および キャッシュのためにETagヘッダーを含まなければMUSTならない。

例(ファイルを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要求は コンテナのメンバー一覧を返す。応答本文は、LWSコンテナメディア 型を使用する、コンテナ表現節で定義されるコンテナ表現である。 一覧には、各メンバーのメタデータが含まれる: リソース識別子(MUST)、型(MUST)、メディア型(DataResourcesについてはMUST)、サイズ(SHOULD)、および 変更タイムスタンプ(SHOULD)。

例(コンテナをGETする):

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を使用し、必須メタデータを持つメンバーを一覧化する。各項目は、 フラットなプロパティとしてtypeidformatsize、およびmodifiedタイムスタンプを含む。

すべての場合において、サーバーは応答 ヘッダーに次のメタデータを含めなければMUSTならない: ETag(メンバーシップ変更時に変化する一覧バージョンを表す)、 それがコンテナであることを示すrel="type"を持つLink ヘッダー、rel="linkset"および rel="up"

HEAD(任意のリソースまたはコンテナヘッダー/メタデータのみ: LWSサーバーは、コンテナおよび非コンテナの両方についてHEAD [RFC9110]をサポートしなければMUSTならず、 GETと同じヘッダー(ETag、Content-Type、メタデータ用Linkを含む)を返すが、本文は返さない。これにより、コンテンツを 転送することなくメタデータ取得が可能になる。

キャッシュおよび条件付き要求: LWSはHTTPキャッシュ意味論を活用する。サーバーは If-None-Match(ETag付き)または If-Modified-Sinceヘッダーを介する条件付き要求をサポートしなければMUSTならない。リソースまたはコンテナ一覧が変更されていない場合、冗長な転送を避けるために 304 Not Modifiedで応答する。ETagは、同時実行およびキャッシュサポートのために、 すべてのGET/HEAD応答で提供されなければMUSTならない。

発見可能性と認可: 発見可能性を高めるため、サーバーは、 クライアントをハードコードされたURIなしで導くパラメーターを持つWWW-Authenticateヘッダーを401 Unauthorized応答に 含めるべきSHOULDである。該当する場合、メタデータリンクも含めるべきSHOULDである。

9.4 リソースを更新する

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

リソースを更新するは、 PUT要求(リソース全体を置換するため)またはPATCH要求(部分的な 変更を適用するため)によって、既存の提供 リソースの内容を変更する。クライアントは、これらの 操作を実行するために、リソースのURLへの書き込みアクセス権を持っていなければならない。 注記: この節は、リソースの主要コンテンツの更新について記述する。そのメタデータを更新するには、第 9.3.2節を参照。 LWSサーバーは、リソースURI上のPUTおよびPATCH要求を、リソースコンテンツのみへの 変更として扱わなければMUSTならず、関連付けられたリンクセットリソースへの既定の影響を持たない。任意で、コンテンツと メタデータの両方を単一の原子的操作で更新するために、クライアントはリソースURIへの PUT/PATCH要求にLinkヘッダーを含め、プリファレンス'Prefer: set-linkset'( RFC 7240で定義)を指定してもMAYよい。この場合、サーバーは、提供されたLinkヘッダーを コンテンツ変更の適用に加えて、リンクセットへの置換(PUTの場合)または部分更新(PATCHの場合)として解釈しなければMUST ならない。この振る舞いはサーバーにとってOPTIONALであるが、サポートされる場合、 意図しないメタデータ上書きを防ぐために、Preferヘッダーを介して明示的に呼び出されなければMUSTならない。結合更新をサポートしないサーバーは、 そのプリファレンスを無視するか、501 Not Implementedで応答しなければMUSTならない。

PUT(リソース全体の置換) – 新しい完全なコンテンツを 本文に含め、一致するContent-Type(通常は既存型と整合)を持つPUTをリソースURIへ送信する。PUTは既存 リソースに対して冪等である。安全のため、現在のETagを持つIf-Matchを含める(第7.3節の同時実行に従う)。不一致は 412 Precondition Failedまたは409 Conflictを生じる。検査なしでは更新は無条件だが、 同時変更を上書きする危険がある。サーバーがリソースについてEtagsをサポートする場合、サーバーは If-Matchヘッダーを欠く無条件PUT要求を428 Precondition Required応答で拒否しなければMUSTならない。

例(リソースを更新する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 "abc123456"を持つIf-Matchヘッダーを含めている。 サーバーはそれを現在のETagと比較する。一致する場合、提供されたJSONでコンテンツを置換する。 一致しない場合、サーバーは更新を拒否する(その間に他者によってリソースが変更されたため)。 成功応答: 更新が成功した場合、サーバーは200 OKで応答し、 更新された表現または何らかの確認(新しいコンテンツまたはその一部など)を含めてもよい。あるいは、 サーバーは、本文なしで成功を示すために204 No Contentで応答してもよい(特に追加情報を伝える必要がない場合によく使われる)。 いずれの場合でも、サーバーは新しいバージョンを示す新しい ETagを含めるべきSHOULDであり、本文が返される場合はContent-Typeも含めてもよい。例:

HTTP/1.1 204 No Content
ETag: "def789012"

これは、更新が完了したことをクライアントに知らせ、新しいETagを提供する。サーバーが 更新されたコンテンツを返すことを選択した場合、200 OKを使用して本文にJSONを含め、 ヘッダーも伴うことができる。

PATCH(部分更新) – HTTP PATCHメソッド[RFC5789]は、 クライアントがリソース全体の新しいコンテンツを送信するのではなく、部分的な変更を指定できるようにする。 これは、全体コンテンツを送信することが非効率な大きなリソースで、小さな部分だけが変更された場合や、 特定の変更を適用したい同時編集に役立つ。LWS サーバーは、[RFC7386]で定義されるJSON Merge Patch(application/merge-patch+json)を 最低限サポートしなければMUSTならない。

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

メタデータの同時実行制御 リソースのメタデータは複数の行為者によって変更され得るため、同時上書きの防止は 重要である。データ完全性を確保するため、LWSサーバーおよびクライアントは、 リンクセットリソース上のすべての PUTおよびPATCH操作について、条件付き要求[RFC7232]を使用する楽観的同時実行制御を実装しなければMUSTならない。 サーバーの責任: サーバーは、リンクセットリソースに対するGETおよびHEAD要求への応答にEtagヘッダーを含めなければMUSTならない。 リンクセット上のPUTまたはPATCHが成功した場合、サーバーは変更されたリンクセットに対して新しい 一意のEtag値を生成し、それを応答のEtagヘッダーで返さなければMUSTならない。 クライアントの責任: リンクセットリソースを変更する場合、クライアントはそのリソースについて受け取った最新のEtagを含む If-Matchヘッダーを含めなければMUSTならない。 処理規則: If-Matchヘッダー値がリンクセットの現在のEtagと一致しない場合、サーバーは 412 Precondition Failedステータスコードで要求を拒否しなければMUSTならない。 リンクセットURIへのPUTまたはPATCH要求からIf-Matchヘッダーが欠けている場合、サーバーは 428 Precondition Requiredステータスコード[RFC6585]で要求を拒否しなければMUSTならない。 例(リンクセットを置換するPUT): クライアントはまずリンクセットを取得し、そのETagを受け取る。

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
ETag: "meta-v1"
{
  "linkset": [
    {
      "anchor": "/alice/personalinfo.json",
      "describedby": [ { "href": "/schemas/personal-info.json" } ]
    }
  ]
}

クライアントは今、ライセンスを追加したい。新しい完全なリンクセット文書を構築し、If-Matchヘッダーを持つPUT 要求を送信する。

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

成功した場合、サーバーは成功と新しいETagで応答する。

HTTP/1.1 204 No Content
ETag: "meta-v2"

更新規則の概要 リソースのコンテンツだけを変更したい場合 → リソース自体にPUT/PATCHする。 リソースのリンク(メタデータ)だけを変更したい場合 → リソースに関連付けられたリンクセットリソースにPUT/PATCHする。 コンテンツとリンクの両方を変更したい場合 → 適切な Linkヘッダーおよび'Prefer: set-linkset'を含めてリソース自体にPUT/PATCHする。両方を設定することは既定ではオフである。

9.5 リソースを削除する

リソースおよびその関連メタデータを恒久的に削除する。

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

DELETE要求は、削除するリソースまたはコンテナのURIを対象とする。クライアントは、 同時実行検査のためにETagを持つIf-Matchヘッダーを含めてもMAYよい。

削除と包含: リソースが削除される場合、サーバーはそれを 親コンテナitems一覧から原子的に削除しなければMUSTならない。親コンテナの totalItems数は、それに応じて更新されるべきSHOULDであり、そのETagは 変更を反映するよう更新されなければMUSTならない。

非コンテナリソースについて、サーバーはリソースコンテンツ、その関連メタデータ(リンクセットリソース)、および親コンテナ内の包含参照を 削除する。

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

成功時、サーバーは204 No Contentで応答しなければMUSTならない。サーバーは、 [RFC9110]で定義される条件付き要求をサポートすべきSHOULDである。

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

例(非コンテナリソースを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、ETag、rel="linkset"、 rel="up"などのメタデータ用Link)を伴う。コンテナ一覧については、規範的コンテキストおよびメンバー メタデータ(ID、型、サイズ、タイムスタンプ)を持つJSON-LDを含める。
作成済み(新しいリソース) 201 Created 通常は応答本文なし(または新しいリソースの最小表現)。 Locationヘッダーは新しいリソースのURIに設定される。ETagのようなヘッダーは 同時実行のために含まれなければMUSTならない。サーバー管理 メタデータ用のLinkヘッダー。
削除済み(返すコンテンツなし) 204 No Content 応答本文なし。リソースが削除された、または要求が成功し、他に伝えることがないことを示す。 サーバーは恒久的な 削除に410 Goneを使用してもMAYよい。
Bad Request(無効な入力または制約) 400 Bad Request 何が誤っていたかを説明するエラー詳細。サーバーは、 構造化エラー応答のために、[RFC9457]で定義される標準形式、 たとえば"type"、"title"、 "status"、"detail"、および"instance"のようなフィールドを持つJSONオブジェクトを使用すべきSHOULDである。

10. 通知

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

10.1 通知の発見

ストレージは通知をサポートしてもよい。通知をサポートするストレージは、そのストレージ記述 リソースのservice配列内で、typeNotificationServiceに等しい サービスオブジェクトを通知しなければならない

サービスオブジェクトは、その値がサブスクリプションエンドポイントのURIである serviceEndpointプロパティを含まなければならない。サービスオブジェクトは、 その値が文字列の配列であり、それぞれがサポートされるサブスクリプションタイプを識別する subscriptionTypeプロパティを含まなければならない

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

10:通知サービスを含むストレージ記述
{
  "@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 アクティビティプロパティを参照。
11:通知エンベロープ
{
  "@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 アクティビティタイプ

サーバーは、LWSリソースの変更を示すため、次のActivity Streams 2.0アクティビティタイプを サポートしなければならない

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

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

10.2.4 通知のバッチ処理

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

12:バッチ処理された通知
{
  "@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 サブスクリプション

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

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

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

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

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

13:サブスクリプション要求
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 サブスクリプションタイプ 識別子

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

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

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

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

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

11.1 発見

ストレージは、そのストレージ記述リソースで、 アクセス要求および アクセス許可のサポートを通知してもよい。 このようなサポートが通知される場合、アクセス要求のエンドポイントを記述するサービス オブジェクトは、文字列AccessRequestServiceに等しい typeを持たなければならずアクセス許可のエンドポイントを記述する サービスオブジェクトは、文字列AccessGrantServiceに等しい typeを持たなければならない。サービス オブジェクトは、その値が、そのエンドポイントでサポートされるアクセスプロファイルを識別する1つ以上のURIの集合である conformsToプロパティを含むことが望ましい。 追加のプロパティを含めてもよい

14:アクセス要求およびアクセス許可サービスを含むストレージ記述
{
  "@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シリアル化を使用して示されている。

15:アクセス要求
{
  "@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シリアル化を使用して示されている。

16:アクセス許可
{
  "@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を含めなければならない。 追加のタイプ値を含めてもよい

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

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

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

11.2.2 ストレージ

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

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

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

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

11.2.3 受信箱

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

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

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

19: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を含めなければならない。 追加のタイプ値を含めてもよい

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

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

11.3.2 アクション

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

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

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

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

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

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

11.3.3 割当先

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

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

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

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

11.3.4 対象

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

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

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

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

  • https://www.w3.org/ns/lws#DataResourcelws:DataResourceタイプのリソースに一致する。
  • https://www.w3.org/ns/lws#Containerlws:Containerタイプのリソースに一致する。
  • https://www.w3.org/ns/lws#StorageResourceストレージによって管理される任意のリソースに一致する。

サーバーは、追加のタイプ値をサポートしてもよい

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

23:リソースタイプを含むtargetプロパティ
{
  "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の配列であり、明示された目的が列挙された値のいずれかと 一致する場合に制約が満たされる:

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

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

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

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

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

すべてのLWSリソースは、タイプ値を示すリンクヘッダーを含む:

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

28:リソースタイプの制約
{
  "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 SchemadateTime文字列である:

29:時間的制約
{
  "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 制約の結合

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

30:結合された制約
{
  "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である。

31: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 メディアタイプは、LWS 語彙で拡張された W3C Controlled Identifier 文書 [CID-1.0] を特殊化した文書を識別する。

LWS コンテナー表現は、メディアタイプ application/lws+json対応しなければならない

LWS コンテナー表現は JSON-LD の規約を使用するが、LWS の制約および要件は、 特定のメディアタイプを使用する根拠となる。LWS コンテナーは JSON-LD の制限付きプロファイルとみなせるため、 実装は、メディアタイプ application/ld+json; profile="https://www.w3.org/ns/lws/v1"application/lws+json と同等とみなすべきである

12.1.1 メディアタイプの等価性

コンテナー表現では、メディアタイプ application/lws+jsonapplication/ld+json、および application/json は同等である。レスポンス本文は、8.1 コンテナー 表現で定義されている コンテナー表現の構造に準拠する同一の JSON-LD 文書であり、Content-Type レスポンスヘッダーのみが異なる。サーバーは、これらの メディアタイプのいずれかを求めるリクエストを受け入れなければならずContent-Type レスポンスヘッダーを要求された メディアタイプに設定しなければならない

コンテナーレスポンスの Content-Type はリクエストの Accept ヘッダーに依存するため、これらのレスポンスには Vary: Accept ヘッダーを含めるべきである [RFC9110]。

注記(非規範的): この等価性は、上記の3つのメディアタイプにのみ適用される。 あらゆる HTTP リソースと同様に、サーバーは標準的なコンテントネゴシエーションを通じて、コンテナーの追加の表現(たとえば text/turtle)を提供できる [RFC9110]。この 仕様は、そのような対応を要求するものでも妨げるものでもない。

12.1.2 ページネーション

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

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

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

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

12.1.2.3 ページの要求

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

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

12.1.2.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]に従って検証できる。 実装上のセキュリティに関する考慮事項は、「Transport Layer Security(TLS)および Datagram Transport Layer Security(DTLS)の安全な使用に関する推奨事項」[RFC9325]に記載されている。

16.2 トークンセキュリティ

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

ベアラートークンおよびデジタルクレデンシャルは、窃取およびリプレイに対して脆弱である。 緩和策には、適度に短い有効期間の使用、特定のオーディエンスへのトークンのバインド、 およびトークンの安全な保存が含まれる。

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

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

16.4 通知

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

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実装には、 固有のメディアタイプを使用することを正当化する多数の制約および追加要件があることに注意されたい。

LWSコンテナーはJSON-LDの制限されたプロファイルと見なすことができるため、実装は application/ld+json; profile="https://www.w3.org/ns/lws/v1"メディアタイプを application/lws+jsonと同等と見なすことが望ましい

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]
アクティビティ語彙。 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(Paddington 版)。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]
正誤表セット2を組み込んだOpenID Connect Core 1.0 。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
[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, Ed. 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
[RFC6585]
追加のHTTPステータスコード。M. Nottingham; R. Fielding. IETF. 2012年4月。標準化提案。URL:https://httpwg.org/specs/rfc6585.html
[RFC6749]
OAuth 2.0認可 フレームワーク。D. Hardt, Ed. IETF. 2012年10月。標準化提案。URL:https://www.rfc-editor.org/info/rfc6749/
[RFC6750]
OAuth 2.0認可フレームワーク: ベアラートークンの使用法。M. Jones; D. Hardt. IETF. 2012年10月。標準化提案。 URL:https://www.rfc-editor.org/info/rfc6750/
[RFC7231]
ハイパーテキスト転送プロトコル(HTTP/1.1): セマンティクスおよびコンテンツ。R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014年6月。 標準化提案。URL:https://httpwg.org/specs/rfc7231.html
[RFC7232]
ハイパーテキスト転送プロトコル(HTTP/1.1): 条件付き要求。R. Fielding, Ed.; J. Reschke, Ed. IETF. 2014年6月。標準化 提案。URL:https://httpwg.org/specs/rfc7232.html
[RFC7233]
ハイパーテキスト転送プロトコル(HTTP/1.1):範囲 要求。R. Fielding, Ed.; Y. Lafon, Ed.; J. Reschke, Ed. 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/
[RFC7386]
JSONマージパッチ。P. Hoffman; J. Snell. IETF. 2014年10月。標準化提案。URL:https://www.rfc-editor.org/info/rfc7386/
[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, Ed.; J. Bradley; C. Mortimore. IETF. 2020年1月。標準化 提案。URL:https://www.rfc-editor.org/info/rfc8693/
[RFC9068]
OAuth 2.0 アクセストークン用JSON Web Token(JWT)プロファイル。V. Bertocci. IETF. 2021年10月。標準化提案。URL:https://www.rfc-editor.org/info/rfc9068/
[RFC9110]
HTTPセマンティクス。R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月。インターネット標準。URL:https://httpwg.org/specs/rfc9110.html
[rfc9112]
HTTP/1.1。R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月。インターネット標準。URL:https://httpwg.org/specs/rfc9112.html
[RFC9264]
リンクセット:リンクセット用のメディアタイプおよびリンク関係 タイプ。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/
[URL]
URL標準。Anne van Kesteren. WHATWG。 現行標準。URL:https://url.spec.whatwg.org/
[WebArch]
World Wide Webのアーキテクチャ、第 1巻。Ian Jacobs; Norman Walsh. W3C. 2004年12月15日。W3C勧告。URL:https://www.w3.org/TR/webarch/
[XMLSCHEMA11-2]
W3C XML Schema定義言語(XSD)1.1 第2部:データ型。David Peterson; Sandy Gao; Ashok Malhotra; Michael Sperberg-McQueen; Henry Thompson; Paul V. Biron et al. 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/
[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