Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Linked Web Storage Protocol仕様は、アプリケーションに対し、外部に保存されたデータへの安全で許可に基づく アクセスを相互運用可能な方法で提供することを目的とする。
この節は、この 文書の公開時点における位置付けを説明する。現在のW3C 公開物の一覧およびこの技術報告書の最新版は、 W3C標準および草案 インデックスで確認できる。
これは非公式な提案である。
この文書は、Linked Web Storageワーキング グループにより、 勧告 トラックを用いる作業草案として公開された。
作業草案としての公開は、 W3Cおよびそのメンバーによる承認を 意味しない。
これは草案文書であり、いつでも他の文書により更新、置換、または廃止される可能性がある。 この文書を進行中の作業以外のものとして引用することは不適切である。
この文書は、 W3C 特許 ポリシー の下で運営されるグループにより作成された。 W3Cは、このグループの成果物に関連して行われた 特許開示の公開一覧 を管理している。そのページには、 特許を開示するための手順も含まれる。個人が、 必須クレーム を含むとその個人が信じる特許について実際の知識を有する場合、 W3C特許ポリシー第6節 に従ってその情報を開示しなければならない。
この文書は、 2025年8月18日のW3Cプロセス文書 によって管理される。
この節は非規範的である。
この仕様は、エージェントのアイデンティティおよび権限に基づいて、クライアントアプリケーションが Web リソースにアクセスして管理できるようにする Linked Web Storage(LWS)プロトコルを定義する。
リソースサーバーがリンクされたリソースの階層を管理し、それらへのアクセスを提供する方法を標準化することで、この プロトコルにより、ユーザーは異なるクライアントアプリケーションを使用して、同じ保存データを操作できる。これらの リンクされたリソースは、対象が配置されている場所を記述するコンテナーおよび包含関係と、 リソース相互の関係を記述するメタデータによって定義される。
このプロトコルは、これらのリソースを作成、読み取り、更新、および削除するための標準操作を定義する。各 リソースは URI によって識別される。クライアントはルートコンテナーからリソース階層をたどり、 サーバー応答で提供されるリンクを通じて、包含されているリソースおよびそれらの関係を検出する。
エージェントのアイデンティティは、Linked Web Storage サーバーの外部に配置できるアイデンティティプロバイダーを通じて確認される。この疎結合により、サーバーが必ずしも認証情報を直接管理する必要はなく、代わりに、 信頼されたアイデンティティ プロバイダーによって発行されたトークンとして、署名付き認証資格情報を受信して検証できる。したがって、ユーザーは、そのサーバー専用の 新規または既存のアカウントを常に必要とすることなく、既存のアイデンティティを準拠サーバーに提示できる。LWS は、たとえば OpenID Connect、SAML 2.0、および自己署名された制御識別子(CID)の仕様で定義されているユーザー認証を使用する。
認可は、要求を行うエージェントがリソースにアクセスする権限、またはそのリソースに対して 操作を実行する権限を持つかどうかを決定する。準拠 LWS サーバーは、各リソースについて、そのリソースが 非公開(すなわち、その所有者のみが利用可能)、制限付き(すなわち、定義された ユーザーの集合が利用可能)、または公開(すなわち、任意のユーザーが利用可能)であるかを決定するリソースマネージャーを指定する。サーバーは、各クライアント要求を処理する際に、 リソースマネージャーによるアクセス決定を適用する。
この仕様は、次の利用者による使用を意図している。
異なる LWS サーバーインスタンスは、それぞれ独自のリンクされたリソース階層を維持する。エージェントは、 同じ識別情報を使用して複数のサーバーをたどることができ、各サーバーのリソースへのアクセスは、 そのサーバーのリソースマネージャーによって付与された権限によって決定される。すべての LWS サーバーインスタンスが あらゆるエージェント識別子をサポートするとは限らない。特定の LWS サーバーインスタンスでは、そのサーバー インスタンスによって管理されるリソースへのアクセスを得るために、特定のアイデンティティプロバイダーを介してエージェントが自身を 識別することを要求する場合がある。
LWSプロトコルは、ある主体が何らかのリソースを何らかのエージェントに利用可能にできる標準的なやり取りを定義する。
リソース管理者は、提供リソースを 非公開に保つことも、誰にでも公開することも、その可視性を制約された一群の 要求エージェントに限定することもできる。
非規範的と明示された節に加え、この仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様のそれ以外のすべては規範的である。
この文書におけるキーワードMAY、MUST、MUST NOT、OPTIONAL、RECOMMENDED、REQUIRED、SHOULD、およびSHOULD NOTは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されるとおりに解釈される。
LWSサーバーは、この仕様における関連するすべての「MUST」 文に適合するHTTPサーバー[rfc9112]である。具体的には、 この文書の9. 操作における関連する規範的な「MUST」文を尊重MUSTする。
LWS クライアントは、この仕様における関連するすべての「MUST」文に適合するHTTPクライアント[rfc9112]である。具体的には、この文書の9. 操作における関連する規範的な 「MUST」文をMUST尊重する。
次の図は、実装の指針となる プラットフォーム非依存のモデルである。
「認可サーバー」および「クライアント」という用語は、OAuth 2.0 認可フレームワーク [RFC6749] で定義されています。
「エンドユーザー」および「発行者」という用語は、OpenID Connect Core 1.0 [OPENID-CONNECT-CORE] で定義されています。
この仕様では、次の用語を定義します。
conformsToプロパティで参照することにより、1つ以上のアクセスプロファイルのサポートを示します。
この節は、Linked Web Storageサーバーとやり取りするエージェントおよびエンドユーザーを識別するためのメカニズムを定義する。 この仕様は、認証資格情報の特定の形式を義務付けないが、既存の身元システムを Linked Web Storage認可フレームワークと組み合わせて使用する方法を記述する。
この節で記述されるデータモデルは、認証資格情報の任意の 具体的なシリアル化に対する要件を概説する。
認証資格情報は、主体に関する改ざん明示的なクレームを含まなければMUSTならず、これには次が含まれる:
認証資格情報の検証には、検証者と資格情報の発行者との間の信頼 関係が必要である。この信頼関係は、アウトオブバンドのメカニズムを通じて確立されてもMAYよい。 検証者と発行者との間の信頼を確立するための追加メカニズムは、特定の認証スイートで概説される。
認証資格情報は署名されなければMUSTならない。署名には非対称暗号を用いることがRECOMMENDEDされる。
各認証スイートは、トークン型URIに関連付けられなければMUSTならない。 認証スイートは、IANA「OAuth URI」レジストリで定義されたURIを使用すべきSHOULDである。
ストレージ記述リソースは、クライアントが ストレージとやり取りする際に使用できる情報を提供し、 機能およびサービスエンドポイントの記述を含む。
ストレージ記述リソースは、 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 でなければならない。{
"@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/"
}]
}
ストレージリソースを対象とするGETおよびHEAD要求に対するすべての応答は、必ず、
ストレージの正規URIをターゲットとし、値がhttps://www.w3.org/ns/lws#storageと等しい関係
(rel)パラメーターを含む
Linkヘッダーを含めなければなりません。
ストレージURIに対する要求は、コンテントネゴシエーションによって異なる形式が要求されない限り、
メディアタイプがapplication/lws+cidである
ストレージ記述リソースデータモデルに
準拠する文書を必ず返さなければなりません。
ストレージ記述リソースには、必ず、serviceEndpointがストレージルートコンテナーのURIである
StorageRootサービスが含まれなければなりません。
ストレージに接続された追加のサービスも存在してもよいものとします。
これらの追加サービスのAPI定義は、この仕様の範囲外です。
ストレージ記述は、メディアタイプ
application/lws+cid でシリアル化可能でなければならない。
@context プロパティは、URI
https://www.w3.org/ns/cid/v1
および https://www.w3.org/ns/lws/v1 で始まる配列でなければならない。
その他の表現がコンテンツネゴシエーションを通じて利用可能であってもよい。
{
"@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"
}]
}
リンクトウェブストレージは、リソースをコンテナーに編成します。コンテナーは、 メンバーと呼ばれる他のリソースへの参照を保持する特殊なリソースです。コンテナーは、 ディレクトリーやコレクションに類似した編成単位として機能し、クライアントがリソースをグループ化、検出、 およびナビゲートできるようにします。コンテナーは、そのメンバーリソースへの参照を維持します。 メンバーリソースには、非コンテナーリソースと追加のコンテナーリソースの両方を含めることができ、それによって 階層構造を形成できます。通常、コンテナーが保持する固有の内容は、 メタデータまたはそのメンバーの列挙を除けば最小限であり、その主な役割は、下位のリソースを集約して 構造化することです。ストレージシステムのルートは、上位の親を持たない 最上位の編成単位として機能するコンテナーとして指定されます。コンテナー表現の構造は、8.1 コンテナー 表現で定義され、そのメディアタイプおよびページネーション要件は、12. LWSメディアタイプで定義されます。 ストレージは、ルートコンテナーとして機能してもよく、直接書き込みを可能にします。
すべてのLWSストレージには、最上位の編成単位として機能するストレージ ルートがあります。ストレージルートには親がなく、ストレージ 階層へのエントリーポイントとして機能します。
LWS内のリソースは、次のいずれかに分類される:
リソースとその親コンテナとの間の包含関係は、rel="up"リンク
関係によって表現される。サーバーは、任意の
非ルートリソースに対するGETおよびHEAD要求への応答において、親コンテナを指す
rel="up"を持つLinkヘッダーを含めなければMUSTならない。
Link: </alice/notes/>; rel="up"
コンテナのメンバーは、その表現内で
itemsプロパティを用いて一覧化される。サーバーがこの一覧を管理するため、クライアントは直接変更できない。
メンバーシップの変更は、リソースの作成および削除の副作用として発生する。
サーバーは、常に包含の完全性を維持しなければMUSTならない:
リソースはURIによって識別されます。リソースのURIは、包含階層内の位置から独立しています。サーバーはリソースの 作成時にURIを割り当て、クライアントヒントを組み込んでもよいものとしますが、クライアントはURI構造が包含を反映していると仮定すべきではありません。
包含関係は、URIパス構造ではなく、メタデータ
(rel="up"リンクおよびコンテナ
表現内のitemsプロパティ)を通じて表現される。この分離により、明確に定義された編成モデルを維持しながら、
サーバーはURI割り当てに柔軟性を持てる。
クライアントが コンテナーを取得すると、サーバーは、その コンテナーおよびその内容を記述する、構造化された コンテナー表現を返す。この節では、コンテナー表現の必須および オプションのプロパティを定義する。
コンテナ表現は、次のプロパティを含まなければMUSTならない:
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日時文字列として表現される。次の例は、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"
}
]
}
この節は、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 メディアタイプで定義される。
この節では、メタデータをLWSリソースに関連付けるためのモデルを定義します。 LWSメタデータシステムは、型付きリンクを使用してサーバーがリソース間の関係を記述できる ウェブリンク [RFC8288] の原則に基づいています。 メタデータは検出可能性を高め、自己記述型APIをサポートし、リソース操作およびコンテナー階層と整合します。
メタデータモデル LWS内のすべてのメタデータは、リソース(リンクコンテキスト)を起点とする型付きリンクの集合として表現されます。 各リンクは、次の要素で構成されます。
メタデータはリソースとその表現を区別し、該当する場合には複数のメディアタイプを 使用できるようにします。データリソースの場合、メタデータには表現が含まれ、各表現は formatおよび任意のsizeInBytesを持ちます。コンテナーおよびデータリソースでは、親コンテナーリソースへのリンクを、そのリソースのメタデータの一部と見なします。
リンクセットリソース ストレージ内の各リソースについて、サーバーは必ずメタデータリンクを、 [RFC9264]に従って独立したリソースとして利用可能にしなければなりません。
rel="linkset"を持つLinkヘッダーを介して検出できます。
application/linkset+jsonとして利用可能でなければなりません。
メタデータの検出 クライアントは、主にGETまたはHEAD要求への応答に含まれるLinkヘッダーを通じてメタデータを検出します。
rel="https://www.w3.org/ns/lws#storage"を持つLinkヘッダーを含めなければなりません。
rel="up"を持つLinkヘッダーを必ず含めなければなりません。
https://www.w3.org/ns/lws#PreferLinkRelationsとともにPreferヘッダー [RFC7240]を使用してもよいものとします。
メタデータの種類
| カテゴリー | 説明 |
|---|---|
| システム管理 | サーバーによって維持され、読み取り専用です。linkset、type、
format、size、modifiedが含まれます。
|
| コアメタデータ | クライアントによって管理されます(サーバーの制限に従います)。up、
items、title、creatorが含まれます。
|
| ユーザー定義 | ユーザーが作成したカスタム語彙およびインデックス。 |
変更可能性に関する考慮事項 コアメタデータは、クライアントによって変更してもよいものとします。相互運用性を確保するため、サーバーは、 必ず標準HTTPヘッダーを使用して、その能力を通知しなければなりません。
メソッドの検出:サーバーは、Allowヘッダーを介して、リンクセットリソースに対するGETおよびPATCH 操作のサポートを必ず通知しなければなりません。
パッチ形式の検出:サーバーは、Accept-Patchヘッダーを介してJSONマージ
パッチ [RFC7386] のサポートを必ず通知しなければなりません。
Accept-Patch: application/merge-patch+json。
任意のメソッド:サーバーは、任意でPUTまたは代替のパッチ形式をサポートできます。 サポートする場合、それらは必ずそれぞれAllowヘッダーおよびAccept-Patch ヘッダーに含まれなければなりません。
[!IMPORTANT] クライアントは、リソースヘッダーで通知されていない限り、PUTまたは特定のパッチ形式のサポートを仮定すべきではなく、 405 Method Not Allowedまたは415 Unsupported Media Type応答を必ず適切に処理しなければなりません。
メタデータの管理 メタデータは、リソースに関連付けられたリンクセットリソース URIとやり取りすることによって管理されます。サーバーは、更新の同時実行制御を必ずサポートしなければなりません。
部分更新(PATCH):これは、メタデータ管理の主要なメカニズムです。サーバーは、必ずapplication/merge-patch+jsonを使用するPATCHをサポートしなければなりません。
置換(PUT):Allowヘッダーで通知されている場合、クライアントはリンクセット全体を置換してもよい ものとします。サーバーがPUTをサポートしない場合、必ず 405 Method Not Allowedで要求を拒否しなければなりません。
制限:サーバーは、システムの整合性を維持するため、upや
itemsなどの特定のリンクに対する変更を制限してもよいものとします。
ライフサイクル:メタデータのライフサイクルは、記述対象のリソースに結び付けられます。リソースを削除すると、必ず、関連付けられたリンクセットリソースのメタデータが自動的に削除されなければなりません。
リソースを作成する操作は、新しい提供リソースを既存のコンテナに追加する。この 操作は、データリソースおよびサブコンテナの作成の両方を扱う。
入力:
振る舞い:
可能な応答:
新しいリソースは、対象となるコンテナー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を使用して、既存のコンテナー内に新しいリソースを追加します。サーバーがリソースの 識別子を割り当てます。クライアントは、作成するリソースの種類を次のように示します。
rel="type"を持つLinkヘッダーを必ず含めなければなりません。
Link: <https://www.w3.org/ns/lws#Container>; rel="type"。
Content-Typeヘッダーとともに、要求本文にリソースの内容を含めます。
例(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バインディング):
rel="https://www.w3.org/ns/lws#storage"を持つLinkヘッダーを原則として含めるべきです。
メタデータの管理および取得(作成に関連):
メタデータは主に読み取り操作によって取得されますが、作成時に生成されます。クライアントは、
作成直後に、新しいリソースURIに対してGETまたはHEADを使用してメタデータを取得できます。クライアントは、
特定のメタデータリンク(関係タイプを介して)および属性を含めるよう要求するために、
Preferヘッダーを使用できます。
既存リソースの表現、またはコンテナの一覧を取得する。
リソースを読み取る操作は、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を使用し、必須メタデータを持つメンバーを一覧化する。各項目は、
フラットなプロパティとしてtype、
id、format、size、および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である。
完全置換または部分パッチを介して、既存の[提供リソース]の状態を変更する。
リソースを更新するは、 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を含め、
ヘッダーも伴うことができる。
If-Matchが一致しなかった場合(同時
変更)、サーバーは412 Precondition Failed(前提条件ヘッダーが失敗したことを意味する)または
409 Conflictを返すことができる。上記の抽象的記述では同時実行の問題に
Conflictを使用しており、409はそのシナリオに対する自然なマッピングである。リソースが存在しない場合、
更新としてのPUTは404 Not Foundになる(意図が作成である場合を除くが、通常クライアントは、自分が何をしているか確実な場合にのみ
PUTを作成に使用するか、またはIf-Matchなしのupsertとして使用する)。クライアントが認可されていない場合は
403 Forbidden(または有効な認証情報が提供されていない場合は401 Unauthorized)。要求ペイロードが有効でない場合は
400 Bad Request。
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する。両方を設定することは既定ではオフである。
リソースおよびその関連メタデータを恒久的に削除する。
リソースを削除する操作は、上記の抽象 操作で定義されるように、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
この表は、ページネーション、同時実行制御、クォータ制約、およびメタデータ統合などの 特定シナリオを組み込みながら、一貫性のために汎用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である。 |
この節では、Linked Web Storageサーバーによって管理されるリソースへの変更に関する更新を、 クライアントが適時に受信するためのメカニズムを定義する。この仕様は共通の 通知データモデルおよびサブスクリプションメカニズムを定義する。具体的な配信チャネルについては、 個別の通知スイート仕様で説明する。
ストレージは通知をサポートしてもよい。通知をサポートするストレージは、そのストレージ記述
リソースのservice配列内で、typeがNotificationServiceに等しい
サービスオブジェクトを通知しなければならない。
サービスオブジェクトは、その値がサブスクリプションエンドポイントのURIである
serviceEndpointプロパティを含まなければならない。サービスオブジェクトは、
その値が文字列の配列であり、それぞれがサポートされるサブスクリプションタイプを識別する
subscriptionTypeプロパティを含まなければならない。
サービスオブジェクトには追加のプロパティが存在してもよい。
{
"@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配列は、利用可能なタイプを正確に通知する。
通知は、Notificationタイプを持つ
JSON-LD文書として表現される。エンベロープは配信コンテキストに関するメタデータを保持し、
イベントを記述するActivity Streams 2.0 [ACTIVITYSTREAMS-CORE]
[ACTIVITYSTREAMS-VOCABULARY]
アクティビティを包含する。
通知エンベロープは、次のプロパティを持つ:
type — 必須。値は文字列
Notificationでなければならない。
storage — 必須。通知に関連付けられたLWSストレージを
識別するURI。
activity — 必須。JSONオブジェクトまたはJSON
オブジェクトの配列であり、
それぞれがActivity Streams 2.0データモデルに適合し、発生したイベントを
記述する。10.2.2
アクティビティプロパティを参照。
{
"@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"
}
}
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アクティビティで使用される。
サーバーは、LWSリソースの変更を示すため、次のActivity Streams 2.0アクティビティタイプを サポートしなければならない:
Create — コンテナー内に新しいリソースが作成された。
targetフィールドは、リソースが追加されたコンテナーを示す。
Update — 既存のリソースの内容またはメタデータが変更された。
Delete — リソースが削除された。originフィールドは、
リソースが削除されたコンテナーを示す。
その他のアクティビティタイプもサポートしてよい。
サーバーは、activityプロパティの値としてアクティビティオブジェクトの配列を
提供することにより、複数のアクティビティを単一の通知エンベロープに
結合してもよい。
{
"@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"
}
]
}
通知を受信するため、サブスクライバーは、
NotificationServiceのserviceEndpointに
認証済みのPOST要求を送信することにより、サブスクリプションを
作成する。要求本体はapplication/lws+jsonメディアタイプに
適合しなければならない。
サブスクリプション要求は、次のフィールドを含まなければならない:
type — 必須。サブスクリプションタイプを
識別する文字列。
値は、NotificationServiceの
subscriptionType配列に列挙されたタイプのいずれかでなければ
ならない。
topic — 必須。サブスクリプションに含まれる
リソースを識別するURIの配列。
サブスクリプション要求には、具体的なサブスクリプションタイプによって必要とされる 追加のフィールドを含めてもよい。
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"
}
コンテナーに対するサブスクリプションは再帰的である。すなわち、サブスクライバーは、 コンテナー自体、およびそのコンテナーに推移的に包含されるすべてのリソースに関する 通知を受信する。データリソースに対するサブスクリプションは、その個別のリソースにのみ 適用される。
サブスクリプション作成要求が成功した場合の応答は、
application/lws+jsonメディアタイプに適合しなければ
ならず、次のフィールドを含まなければ
ならない:
type — 必須。要求内のサブスクリプションタイプと
等しい文字列。
subscription — 必須。サブスクリプションを表す
URL。
各通知スイートは、サブスクリプションタイプ文字列に
関連付けられなければならない。
サブスクリプションタイプ文字列は、NotificationServiceの
subscriptionType配列、およびサブスクリプション要求の
typeフィールドで使用される。
アクセス要求およびアクセス許可は、エージェントがリソースへのアクセスを要求し、 ストレージコントローラーが定義済みの制約付きでアクセスを許可するためのメカニズムを提供します。 アクセスを要求および許可するためのエンドポイントは、特殊な受信箱の一種として機能します。
エージェントは、 アクセス許可を認可トークンとしてサーバーに提示しません。 むしろ、アクセス許可は、何が、誰に対して、 どのような制約の下で認可されたかを示す記録として機能します。アクセス許可が作成または取り消された(削除された)場合、 その変更を反映するように基盤となるアクセスポリシーを調整することは、 サーバーの責任です。アクセス許可エンドポイントと特定のポリシー 適用層との間の相互作用は、この仕様の範囲外です。
この節で定義するアクセスプロファイルは、 アクション、制約、譲受人など、 オープンデジタル権利言語(ODRL)の概念に基づいています。 他のプロファイルでは、異なる概念的枠組みを使用できます。
ストレージは、そのストレージ記述リソースで、
アクセス要求および
アクセス許可のサポートを通知してもよい。
このようなサポートが通知される場合、アクセス要求のエンドポイントを記述するサービス
オブジェクトは、文字列AccessRequestServiceに等しい
typeを持たなければならず、アクセス許可のエンドポイントを記述する
サービスオブジェクトは、文字列AccessGrantServiceに等しい
typeを持たなければならない。サービス
オブジェクトは、その値が、そのエンドポイントでサポートされるアクセスプロファイルを識別する1つ以上のURIの集合である
conformsToプロパティを含むことが望ましい。
追加のプロパティを含めてもよい:
{
"@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"]
}
]
}
アクセス要求またはアクセス許可は、
アイデンティティおよびルーティングのためのプロパティと、要求または許可された操作を記述する
accessオブジェクトを表現するデータオブジェクトである。ODRLの概念を使用して
アクセス要求を記述するプロファイルについては、11.3
アクセスプロファイルで説明する。
次の例は、アクセス要求を示す。この例は、 11.4.1 JSON-LDシリアル化で定義されるJSON-LDシリアル化を使用して示されている。
{
"@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シリアル化を使用して示されている。
{
"@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"
}
]
}]
}
アクセス要求および アクセス許可には、他のプロパティが存在してもよい。
typeプロパティは、文書のタイプを表す。
typeプロパティの値は、1つ以上の
用語および
絶対URL文字列でなければならない。
アクセス要求の場合、値には用語AccessRequestを
含めなければならない。
アクセス許可の場合、値には用語
AccessGrantを含めなければならない。
追加のタイプ値を含めてもよい。
このプロパティは必須である。
この文書では、アクセス要求および アクセス許可について、次のタイプ値を定義する:
AccessRequest — エージェントによるリソースへのアクセス要求。
AccessGrant — ストレージ
コントローラーによる、リソースへのアクセスを許可する認可。
{
"type": ["AccessGrant"]
}
storageプロパティは、
アクセス要求またはアクセス許可の
スコープとなるLWSストレージを識別する。
storageプロパティの値はURIでなければならない。
このプロパティは必須である。
{
"storage": "https://storage.example/"
}
inboxプロパティは、
アクセス要求またはアクセス許可に関連する
通知を受信するためのURIを指定する(11.6
通知を参照)。
inboxプロパティの値はURIでなければならない。
このプロパティは任意である。
{
"inbox": "https://id.example/agent/inbox/"
}
accessプロパティは、サーバーによってサポートされるプロファイルに基づいて、
1つ以上のアクセスプロファイルの特性を記述する。
ODRL情報モデルに基づく
プロファイルについては、11.3
アクセスプロファイルで説明する。
accessプロパティの値は、1つ以上の
オブジェクトの集合でなければならない。
このプロパティは必須である。
この仕様は、
ODRL情報モデルおよびODRL
語彙に基づき、次のURLで識別される
アクセスプロファイルを定義する:
https://www.w3.org/ns/lws#AccessProfile。
typeプロパティは、アクセス方針のタイプを表す。
typeプロパティの値は、1つ以上の
用語および
絶対URL文字列でなければならず、
用語AccessPolicyを含めなければならない。
追加のタイプ値を含めてもよい。
このプロパティは必須である。
{
"access": [{
"type": ["AccessPolicy"]
}]
}
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)このプロパティは必須である。
{
"access": [{
"action": ["read", "create"]
}]
}
assigneeプロパティは、アクセスを要求している(要求の場合)、
またはアクセスを許可されている(許可の場合)主体を識別する。
assigneeプロパティの値はURIでなければならない。公開
アクセスは、URI
http://xmlns.com/foaf/0.1/Agentによって識別される、FOAF
語彙のAgentクラスを使用して
割り当ててもよい。
このプロパティは必須である。
{
"access": [{
"assignee": "https://id.example/agent"
}]
}
targetプロパティは、
アクセス要求またはアクセス許可が
適用されるリソースを識別する。
targetプロパティは、次のプロパティを含むオブジェクトでなければ
ならない:
この仕様では、対象オブジェクトとともに使用する次の
type値を定義する:
https://www.w3.org/ns/lws#DataResource —
lws:DataResourceタイプのリソースに一致する。
https://www.w3.org/ns/lws#Container —
lws:Containerタイプのリソースに一致する。
https://www.w3.org/ns/lws#StorageResource —
ストレージによって管理される任意のリソースに一致する。
サーバーは、追加のタイプ値をサポートしてもよい。
このプロパティは任意である。
{
"access": [{
"target": {
"type": "StorageResource",
"value": [
"https://storage.example/root/2025",
"https://storage.example/root/2026"
]
}
}]
}
constraintプロパティは、要求または許可されるアクセスを
制限または限定する条件を定義する。このプロパティは、ODRLの
制約モデルを使用する。
constraintプロパティの値が存在する場合、それは制約
オブジェクトの集合でなければならない。各制約オブジェクトは、次の
プロパティを含まなければならない:
leftOperand — 制約されるオペランドを識別する文字列。
operator — 比較演算子を識別する文字列。
rightOperand — 比較対象となる値。タイプは
leftOperandに依存する。
複数の制約オブジェクトが存在する場合、それらすべてを満たさなければ ならない。
このプロファイルのサポートを通知するサーバーは、次の
leftOperand値をサポートしなければならない:
client — HTTP要求のクライアント識別子を表す
format — 対象HTTPリソースのメディアタイプを表す
type — リソースのリンクヘッダーで表現されるタイプURLを表す
purpose — 要求または許可されるアクセスの意図された用途を表す
dateTime — 現在の日時を表す
このプロパティは任意である。
次の例は、これらの制約の使用方法を示す:
次の例では、leftOperandの値として
purposeを使用し、要求または許可されるアクセスの
意図された用途を記述する。eq演算子を使用する場合、
rightOperandの値は目的を識別するURIである。
isAnyOf演算子を使用する場合、rightOperandの
値は目的URIの配列であり、明示された目的が列挙された値のいずれかと
一致する場合に制約が満たされる:
{
"access": [{
"constraint": [
{
"leftOperand": "purpose",
"operator": "isAnyOf",
"rightOperand": [
"https://purpose.example/collaboration",
"https://purpose.example/research"
]
}
]
}]
}
次の例では、leftOperandの値として
clientを使用し、アクセスを特定のクライアント
アプリケーションに制限する。eq演算子を使用する場合、
rightOperandの値はクライアントを識別するURIである:
{
"access": [{
"constraint": [
{
"leftOperand": "client",
"operator": "eq",
"rightOperand": "https://app.example/client-id"
}
]
}]
}
次の例では、leftOperandの値として
formatを使用し、特定のメディアタイプを持つリソースに
アクセスを制限します。eq演算子が使用される場合、
rightOperandの値は、
IANAメディアタイプを識別する文字列です。
isAnyOf演算子が使用される場合、rightOperandの値は
メディアタイプ文字列の配列であり、リソースのメディアタイプが
列挙されたいずれかの値と一致すると、アクセスが許可されます。
{
"access": [{
"constraint": [
{
"leftOperand": "format",
"operator": "isAnyOf",
"rightOperand": ["image/jpeg", "image/png"]
}
]
}]
}
すべてのLWSリソースは、タイプ値を示すリンクヘッダーを含む:
Link: <https://www.w3.org/ns/lws#DataResource>; rel="type"
Link: <https://type.example/Playlist>; rel="type"
次の例では、leftOperandの値として
typeを使用し、HTTP Linkヘッダーで通知される
リソースタイプに基づいてアクセスを制限する。
eq演算子を使用する場合、rightOperandの値は
リソースタイプを識別するURIである。isAnyOf演算子を
使用する場合、rightOperandの値はタイプURIの配列であり、
リソースのタイプが列挙された値のいずれかと一致する場合にアクセスが
許可される:
{
"access": [{
"constraint": [
{
"leftOperand": "type",
"operator": "isAnyOf",
"rightOperand": [
"https://type.example/Playlist",
"https://type.example/Song"
]
}
]
}]
}
次の例では、leftOperandの値として
dateTimeを使用し、アクセスを特定の時間枠に
制限する。gteq演算子は時間枠の開始を定義し、
lteq演算子は終了を定義する。時間的制約の
rightOperandの値は、
XML
SchemaのdateTime文字列である:
{
"access": [{
"constraint": [
{
"leftOperand": "dateTime",
"operator": "gteq",
"rightOperand": "2026-03-09T12:00:00Z"
},
{
"leftOperand": "dateTime",
"operator": "lteq",
"rightOperand": "2026-06-09T10:00:00Z"
}
]
}]
}
複数の制約オブジェクトが存在する場合、アクセスを許可するには、 それらすべてを満たさなければならない。 次の例では、特定の日付より前におけるアクセスを、特定のクライアント アプリケーションに制限する:
{
"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"
}
]
}]
}
この節で定義するデータモデルは、特定の シリアル化に依存しない。
この仕様は、アクセス要求および
アクセス許可のためのJSON-LDシリアル化を定義する。
このシリアル化を使用する文書は、
https://www.w3.org/ns/lws/v1を含む順序付き集合を値とする
@contextプロパティを含めなければならない。
拡張用語を定義するために、追加のコンテキスト項目を含めてもよい。
このシリアル化に関連付けられたメディアタイプはapplication/lws+jsonである。
{
"@context": [
"https://www.w3.org/ns/lws/v1"
]
}
アクセス要求およびアクセス許可の エンドポイントはLWSコンテナーであり、この仕様で定義される規則に 適合しなければならない。
これらのエンドポイントでは、最低限GETおよびPOST操作のサポートが必要である。 DELETE操作が推奨される。その他の操作をサポートしてもよい。
これらのエンドポイントは、要求および応答ペイロードの両方について、 11.4.1 JSON-LD シリアル化で定義されるJSON-LDシリアル化をサポートしなければならない。 サーバーは、追加のシリアル化をサポートしてもよい。
エージェントは、
アクセス要求エンドポイントに
POST要求を送信することにより、アクセス要求を作成する。
ストレージ
コントローラーは、アクセス許可エンドポイントに
POST要求を送信することにより、アクセス許可を作成する。
成功したPOST操作は、Locationヘッダーを
新しいリソースのURLに設定して応答しなければならない。
POST / — アクセス要求を作成する。GET / — アクセス要求の一覧を取得する。GET /:id — 特定のアクセス要求を取得する。DELETE /:id — アクセス要求を取り消す。POST / — アクセス許可を作成する。GET / — アクセス許可の一覧を取得する。GET /:id — 特定のアクセス許可を取得する。DELETE /:id — アクセス許可を取り消す。
通知は、エージェントおよびストレージ
コントローラーに、
アクセス要求およびアクセス許可の変更について
通知するためのメカニズムを提供する。アクセス要求またはアクセス許可に
inboxプロパティが存在する場合、サーバーは、割当先にイベントを通知するため、
そのエンドポイントに通知を配信することが望ましい。
通知のシリアル化は、LWS通知データモデルの要件に 適合しなければならない。
inboxエンドポイントに配信される通知は、通知配信について
LWSプロトコルで定義される要件に適合しなければならない。
この節で説明する通知メカニズムは、
Linked Data
Notificationsパターンと同等である。
このパターンでは、通知はinboxプロパティを介して発見され、
その受信箱にPOST要求を送信することによって配信される。
サーバーは、次のイベントに応じて通知を送信することが望ましい:
inboxにおいて通知することが望ましい。
サーバーは、その他のイベントに応じて通知を送信してもよい。
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 と同等とみなすべきである。
コンテナー表現では、メディアタイプ
application/lws+json、application/ld+json、および
application/json は同等である。レスポンス本文は、8.1 コンテナー
表現で定義されている コンテナー表現の構造に準拠する同一の
JSON-LD 文書であり、Content-Type レスポンスヘッダーのみが異なる。サーバーは、これらの
メディアタイプのいずれかを求めるリクエストを受け入れなければならず、Content-Type レスポンスヘッダーを要求された
メディアタイプに設定しなければならない。
コンテナーレスポンスの Content-Type はリクエストの
Accept ヘッダーに依存するため、これらのレスポンスには
Vary: Accept ヘッダーを含めるべきである [RFC9110]。
注記(非規範的): この等価性は、上記の3つのメディアタイプにのみ適用される。
あらゆる HTTP リソースと同様に、サーバーは標準的なコンテントネゴシエーションを通じて、コンテナーの追加の表現(たとえば
text/turtle)を提供できる [RFC9110]。この
仕様は、そのような対応を要求するものでも妨げるものでもない。
コンテナーなどの特定の複合リソースは、多数のリソースを保持する場合がある。 クライアントが一覧を段階的に取得できるようにするため、サーバーは、メンバー数がサーバーによって決定された しきい値を超える コンテナーについて、ページネーションに対応するべきである。
ページネーションはリンクベースである。サーバーは HTTP Link ヘッダーを介してページネーション URI を提供し
[RFC8288]、
クライアントが数値オフセットに依存せずに一覧全体をナビゲートできるようにする。
一覧がページ分割されている場合、レスポンス本文には現在のページの項目のみが含まれる。
複合リソースの id、type、および totalItems プロパティは
メンバー全体を反映する一方、items には
現在のページにあるリソースのみが含まれる。
ページネーション URI は、次の標準リンク
関係を使用して Link ヘッダーで伝達される。
rel="first":結果の最初のページの URI。ページ分割されたレスポンスに存在しなければならない。rel="last":結果の最後のページの URI。ページ分割されたレスポンスに存在してもよい。rel="next":結果の次のページの URI。後続の
ページがある場合は存在しなければならない。最後のページでは省略しなければならない。
rel="prev":結果の前のページの URI。先行する
ページがある場合は存在してもよい。最初のページでは省略しなければならない。すべてのページネーション URI はクライアントにとって不透明である。クライアントは、ページネーション URI を構築または変更するべきではない。サーバーによって提供された URI を使用するべきである。
クライアントは、最初のページを取得するために複合リソースの URI を要求する。レスポンスには、 クライアントが後続のページを取得するためにたどるページネーション Link ヘッダーが含まれる。サーバーは、以前の走査中に取得したページネーション URI を介した 特定のページへの直接アクセスにも対応してもよい。
ページ分割されたレスポンスを返す場合、サーバーは 200
OK で応答しなければならない。レスポンス本文の totalItems
プロパティは、現在のページだけでなく、すべてのページにわたる項目の総数を反映するべきである。
リクエスト:
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"
}
]
}
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
URIスキーム、リソース命名規約、および解決メカニズムを含め、LWSプロトコル内で リソースがどのように識別され、アドレス指定されるかを定義する。この節は、 別の節(例:リソースアクセス)内に移動される可能性がある
これは意図的に空白のままとしている
相互運用性を維持しながら、LWS実装が異なるプラットフォーム、 環境、およびストレージバックエンド間で動作できるようにするための考慮事項を説明し、 ストレージプロバイダーの変更を可能にする操作手段を提供する
これは意図的に空白のままとしている
この節は非規範的である。
脅威モデル、セキュリティ要件、および安全なLWS展開のための 実装ガイダンスを扱う正式なセキュリティ考慮事項の節。
OAuth 2.0セキュリティの現行ベストプラクティス[RFC9700]で説明される推奨事項は、この 仕様に適用される。
この節は非規範的である。
Transport Layer Security(TLS)は、改ざん、なりすまし、および 情報漏洩を防止するための重要なメカニズムである。TLSで保護された通信は、[RFC6125]に従って検証できる。 実装上のセキュリティに関する考慮事項は、「Transport Layer Security(TLS)および Datagram Transport Layer Security(DTLS)の安全な使用に関する推奨事項」[RFC9325]に記載されている。
この節は非規範的である。
ベアラートークンおよびデジタルクレデンシャルは、窃取およびリプレイに対して脆弱である。 緩和策には、適度に短い有効期間の使用、特定のオーディエンスへのトークンのバインド、 およびトークンの安全な保存が含まれる。
audクレームなどの手段によって
特定の宛先サーバーにバインドされたアクセストークンは、そのバインディングに依存して
トークンのリプレイを防止できる。制限のないオーディエンスを持つクレデンシャルを扱う
アプリケーションは、これらのクレデンシャルを他の主体、特に信頼されていない認可サーバーに
送信する際に注意する必要がある。クレデンシャル発行者がトークンのオーディエンスを
制限できない場合、クライアントはOAuth 2.0 Token
Exchange [RFC8693]などのメカニズムを使用し、
異なるセキュリティドメインの認可サーバーと対話する前に、オーディエンスが制限された
クレデンシャルを作成できる。
localStorage、URL、またはログに保存されると、そのトークンは
流出攻撃を受けやすくなる。
この節は非規範的である。
assignee値が要求元エージェントの
認証済みアイデンティティに関連付けられていることを検証することが推奨される。
この節は非規範的である。
この節は非規範的である。
データ最小化、ユーザーの同意、およびプライバシーを保護する 実装パターンを含む、LWSプロトコルのプライバシーへの影響。
クレデンシャルは、ユーザーおよびエージェントに関する情報を保持する。デジタル署名は改ざんを防止できるが、 クライアントまたは第三者が暗号化されていないクレデンシャル内の値を読み取ることは可能である。
そのため、クレデンシャル発行者には、認証または認可に必要な情報のみを含むトークンを作成し、 必要でない限り機密性の高い属性を含めないことが推奨される。
一般に、暗号化されていないクレデンシャルデータをログに書き込むことはアンチパターンである。 これが必要な場合、実装はクレデンシャルを切り詰めるかハッシュ化して、 クレデンシャル主体のプライバシーを保護できる。
JWTで仮名識別子を使用する場合でも、ストレージサーバーは、同一のエージェントからの要求を 時間の経過にわたって関連付けられる可能性がある。 この場合にユーザーのプライバシーを保護するため、クライアントアプリケーションは、 各JWTが一度だけ使用されるJWTの一括発行を要求できる。 これは、ストレージサーバーがJWTの内容の類似性や送信元IPアドレスなどの他の情報を使用して 要求を関連付けることを防止しない。仮名識別子を使用する場合、認可サーバーは、 同じ識別子を複数回発行しないよう注意する必要がある。
この節は非規範的である。
この節は非規範的である。
actorプロパティを含めると、
誰が変更を行ったかが明らかになる。これは一部のコンテキストでは不適切な場合がある。
actorプロパティはデフォルトで省略することが望ましい。
サーバーは、その包含を構成可能にしてもよい。
この節は非規範的である。
この仕様は、RFC 5785 [RFC5785]によって確立された 「Well-Known URIs」レジストリに、 次の値を追加する。
この仕様は、Linked Web Storageコンテナー形式に適合する文書を
識別するために、application/lws+jsonメディアタイプを登録する。
application/lws+jsonメディアタイプを使用する
リソースは、application/jsonメディアタイプの
すべての要件に適合する必要があり、したがって[RFC8259]の11節で指定される
同じエンコーディングに関する考慮事項の対象となる。
Linked Web Storage形式はJSON-LDの規約を使用するが、LWS実装には、 固有のメディアタイプを使用することを正当化する多数の制約および追加要件があることに注意されたい。
LWSコンテナーはJSON-LDの制限されたプロファイルと見なすことができるため、実装は
application/ld+json; profile="https://www.w3.org/ns/lws/v1"メディアタイプを
application/lws+jsonと同等と見なすことが望ましい。
本仕様は、Linked Web Storage プロトコルに適合するストレージ記述文書を、
W3C Controlled Identifiers 1.0 文書形式を特殊化したものとして識別するための
application/lws+cid メディアタイプを登録する。
application/lws+cid メディアタイプを使用するリソースは、
application/json メディアタイプのすべての要件に適合することが
求められるため、[RFC8259] の
セクション 11 で規定されているものと同じ符号化に関する考慮事項の対象となる。
この節は非規範的である。
この仕様は、Solid Protocol [Solid-Protocol]に大きく依拠している。同プロトコルは、長期間にわたり Sarven Capadisli、Tim Berners-Lee、Kjetil Kjernsmo、Ruben Verborgh、Justin Bingham、Dmitri Zagidulinによって編集された。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: