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 クライアント は、 HTTP クライアント [rfc9112] であり、本仕様書における関連するすべての「MUST」記述に準拠するものです。具体的には、本書の9. 操作における関連する規範的な「MUST」記述を 遵守しなければなりません。
次の図は、実装の指針となる プラットフォーム非依存のモデルである。
「認可サーバー」および「クライアント」という用語は、OAuth 2.0 認可フレームワーク [RFC6749] によって定義されます。
「エンドユーザー」および「発行者」という用語は、OpenID Connect Core 1.0 [OPENID-CONNECT-CORE] によって定義されます。
この仕様では、次の用語を定義します。
conformsTo プロパティでそれらを参照することにより、1 つ以上のアクセスプロファイルへの対応を示します。
https://www.w3.org/ns/lws#StorageResource によって識別されます。
この節は、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リクエストのうち、ストレージリソースを対象とするものへのすべてのレスポンスは、必須として次を含む:
Linkヘッダーで、そのターゲットがストレージの正規URIであり、さらに
関係
(rel)パラメーターの値がhttps://www.w3.org/ns/lws#storageと等しいもの。
ストレージURIへのリクエストは、文書を返すことが必須であり、
その文書は次の
ストレージ記述リソースのデータモデルに適合し、
メディア型はapplication/lws+cidである。
ただし、コンテンツネゴシエーションによって異なる形式が要求される場合を除く。
ストレージ記述リソースは、必須としてStorageRootサービスを含み、その
serviceEndpointは、ストレージルートコンテナーのURIである。
追加のサービスで、ストレージに接続されたものも存在してよい。
これらの追加サービスの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/json-patch+json", "application/merge-patch+json"]
}
}, {
"type": "https://feature.example/ResumableUploads"
}, {
"type": "https://feature.example/ContentNegotiation",
"source": "application/ld+json",
"target": ["text/turtle", "application/n-triples"]
}, {
"type": "https://feature.example/ContentNegotiation",
"source": "image/jpeg",
"target": ["image/png"]
}],
"service": [{
"type": "StorageRoot",
"serviceEndpoint": "https://storage.example/root/"
}, {
"type": "NotificationService",
"serviceEndpoint": "https://storage.example/notification/api",
"subscriptionType": ["WebhookSubscription"]
}, {
"type": "TypeIndexService",
"serviceEndpoint": "https://storage.example/types/index"
}, {
"type": "TypeSearchService",
"serviceEndpoint": "https://storage.example/types/search"
}, {
"type": "DataSharingService",
"serviceEndpoint": "https://storage.example/sharing/api"
}]
}
Linked Web Storageは、リソースをコンテナーに整理する。コンテナーは、 メンバーと呼ばれる他のリソースへの参照を保持する特殊なリソースである。コンテナーは、 ディレクトリーやコレクションに類似した整理単位として機能し、クライアントによるリソースのグループ化、検出、 およびナビゲーションを可能にする。コンテナーは、メンバーリソースへの参照を維持する。 これらには、コンテナーではないリソースと追加のコンテナーリソースの両方を含めることができ、それによって 階層構造を形成できる。通常、コンテナーが保持する固有のコンテンツは、 メタデータやメンバーの列挙以外には最小限であり、その主な役割は集約および構造化である: 下位リソースの。ストレージシステムのルートは、コンテナーとして指定され、 上位の親を持たない最上位の整理単位として機能する。コンテナー表現の構造は、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割り当てに柔軟性を持てる。
LWS のコンテナー表現はコンテナーとその内容を記述する。この節では、その表現が
application/lws+jsonとして提供される場合の必須プロパティと任意のプロパティを定義する。他の RDF メディア
タイプの表現は、コンテンツネゴシエーションを通じて要求できる。
コンテナ表現は、次のプロパティを含まなければ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日時文字列として表現される。次の例は、コンテナーが
https://storage.example/alice/notes/ にあり、2 つのリソースを含むことを示す。他のタブには、
同じコンテナーが LWS プロファイルの他の RDF メディアタイプで示される。
{
"@context": "https://www.w3.org/ns/lws/v1",
"id": "/alice/notes/",
"type": "Container",
"totalItems": 2,
"items": [
{
"type": "DataResource",
"id": "/alice/notes/shoppinglist.txt",
"format": "text/plain",
"size": 47,
"modified": "2025-11-24T12:00:00Z"
},
{
"type": ["DataResource", "http://example.org/customType"],
"id": "/alice/notes/todo.json",
"format": "application/json",
"size": 2048,
"modified": "2025-11-24T13:00:00Z"
}
]
}
@prefix lws: <https://www.w3.org/ns/lws#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<> a lws:Container ;
lws:totalItems 2 ;
lws:items <shoppinglist.txt>, <todo.json> .
<shoppinglist.txt> a lws:DataResource ;
dcterms:format "text/plain" ;
schema:size "47"^^xsd:long ;
dcterms:modified "2025-11-24T12:00:00Z"^^xsd:dateTime .
<todo.json> a lws:DataResource, <http://example.org/customType> ;
dcterms:format "application/json" ;
schema:size "2048"^^xsd:long ;
dcterms:modified "2025-11-24T13:00:00Z"^^xsd:dateTime .
<https://storage.example/alice/notes/> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/ns/lws#Container> .
<https://storage.example/alice/notes/> <https://www.w3.org/ns/lws#totalItems> "2"^^<http://www.w3.org/2001/XMLSchema#integer> .
<https://storage.example/alice/notes/> <https://www.w3.org/ns/lws#items> <https://storage.example/alice/notes/shoppinglist.txt> .
<https://storage.example/alice/notes/> <https://www.w3.org/ns/lws#items> <https://storage.example/alice/notes/todo.json> .
<https://storage.example/alice/notes/shoppinglist.txt> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/ns/lws#DataResource> .
<https://storage.example/alice/notes/shoppinglist.txt> <http://purl.org/dc/terms/format> "text/plain" .
<https://storage.example/alice/notes/shoppinglist.txt> <http://schema.org/size> "47"^^<http://www.w3.org/2001/XMLSchema#long> .
<https://storage.example/alice/notes/shoppinglist.txt> <http://purl.org/dc/terms/modified> "2025-11-24T12:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
<https://storage.example/alice/notes/todo.json> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://www.w3.org/ns/lws#DataResource> .
<https://storage.example/alice/notes/todo.json> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://example.org/customType> .
<https://storage.example/alice/notes/todo.json> <http://purl.org/dc/terms/format> "application/json" .
<https://storage.example/alice/notes/todo.json> <http://schema.org/size> "2048"^^<http://www.w3.org/2001/XMLSchema#long> .
<https://storage.example/alice/notes/todo.json> <http://purl.org/dc/terms/modified> "2025-11-24T13:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> .
この節では、Linked Web Storage (LWS) サーバーが必ずサポートしなければならない4つの中核操作を定義します。これらの操作は、実装の詳細ではなく意味論に重点を置き、 トランスポートに依存しない方法でリソースおよびコンテナーを操作します。各操作では 入力、期待される動作、および可能な応答を指定します。応答には、成功を示す情報、リソースの 表現(該当する場合)、およびエラー条件が含まれます。実装は、これらの操作を原子的かつ一貫して必ず 処理しなければなりません。つまり、各操作は完全に成功するか、 部分的な副作用を残さずに失敗します。エラーの場合、応答は機密情報を漏洩することなく問題を理解するのに 十分な詳細をエージェントに提供することが推奨されます。
各中核操作(作成、読み取り、更新、削除)について、使用するHTTPメソッド、必要な
ヘッダーまたはその他の特別な考慮事項(コンテンツネゴシエーション、コンテナー一覧のページネーション、
および条件付きリクエストを含む)、ならびにサーバーが実行し返すべき内容を説明します。結果を示すために標準のHTTPステータスコードを使用し、
クォータ超過
(507 Insufficient Storage)や前提条件の失敗(412 Precondition Failed)などのシナリオには追加の対応付けを行います。この
バインディングは、Web標準と自然に統合されるよう、HTTP/1.1および関連するRFC(HTTP
の意味論については[RFC7231]、範囲
リクエストについては[RFC7233]、PATCHについては[RFC5789]、Web
Linkingについては[RFC8288]、
およびLink
Setsについては[RFC9264])に準拠するよう努めます。発見可能性は、
Linkヘッダーや401応答のWWW-Authenticateヘッダーなどの仕組みによって重視され、
URIの場所をハードコードすることを回避します。操作全体でメタデータの統合が必要であり、原子性と、
サーバー管理プロパティおよびユーザー管理プロパティのためのLink Setsの使用を保証します。
注: この仕様のすべての例と同様に、この節で示す例(HTTPリクエスト およびレスポンスのスニペット)は非規範的であり、典型的な使用法を説明することを目的としています。実際の 要件は説明文および表に記載されています。また、このバインディングはHTTP( 最初の対象プロトコルとして)を扱いますが、LWS操作は原理上、将来ほかのプロトコルにバインドすることもできます。 コンテナー表現のメディア型要件は、12. LWS メディア型で定義されています。
This section defines the model for associating metadata with Storage Resources。LWS metadata system は、型付き link を使用してサーバーが resource 間の関係を記述できる Web Linking [RFC8288] の原則に基づいている。 Metadata は発見可能性を向上させ、自己記述型 API をサポートし、resource 操作および container 階層と整合する。
Metadata Model LWS におけるすべての metadata は、resource(link context)を起点とする型付き link の集合として表現される。 各 link は以下で構成される。
Metadata は resource とその representation を区別し、該当する場合には複数の media type を許可する。 data resources の場合、metadata には representation が含まれ、 それぞれに format および省略可能な sizeInBytes がある。 containers および data resources については、 親 container resource への link を、 resource の metadata の一部であるとみなす。
Linkset Resource storage 内の各 resource について、サーバーは [RFC9264] に従い、metadata link をスタンドアロン resource として利用可能にしなければならない。
rel="linkset"
を持つ Link header によって発見可能である。
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 Patch
[RFC6902] のサポートを 必須 として通知しなければならない:
Accept-Patch: application/json-patch+json。
任意のメソッド:サーバーは、任意でPUTまたは代替のパッチ形式をサポートできます。 サポートする場合、それらは必ずそれぞれAllowヘッダーおよびAccept-Patch ヘッダーに含まれなければなりません。
[!IMPORTANT] クライアントは、リソースヘッダーで通知されていない限り、PUTまたは特定のパッチ形式のサポートを仮定すべきではなく、 405 Method Not Allowedまたは415 Unsupported Media Type応答を必ず適切に処理しなければなりません。
メタデータの管理
メタデータは、リソースに関連付けられたリンクセットリソースの
URI を操作することで管理されます。サーバーは、GET および HEAD リクエストへの応答に、[RFC9110] で定義されている ETag ヘッダーを必ず含めなければなりません。
部分更新(PATCH):これは、メタデータ管理の主要なメカニズムです。サーバーは、必ずapplication/json-patch+jsonを使用するPATCHをサポートしなければなりません。
置換(PUT):Allowヘッダーで通知されている場合、クライアントはリンクセット全体を置換してもよい ものとします。サーバーがPUTをサポートしない場合、必ず 405 Method Not Allowedで要求を拒否しなければなりません。
制限:サーバーは、システムの整合性を維持するため、upや
itemsなどの特定のリンクに対する変更を制限してもよいものとします。
ライフサイクル:メタデータのライフサイクルは、記述対象のリソースに結び付けられます。リソースを削除すると、必ず、関連付けられたリンクセットリソースのメタデータが自動的に削除されなければなりません。
リソースの作成操作は、新しい提供リソースを既存のコンテナーに追加する。この 操作は、データリソースとサブコンテナーの両方の作成を扱う。
入力:
動作:
考えられる応答:
新しいリソースは、対象のコンテナー URI に POST を使用して作成され、サーバーが
最終的な識別子を割り当てる。クライアントは任意で新しい
リソースのユーザー管理の初期メタデータを、POST 要求に 1 つ以上のLinkヘッダーを含め、
[RFC8288]
の Web リンクの構文に従って提供してもよい。サーバー管理のメタデータは必ず
作成時にサーバーによって自動生成されなければならず、決して
クライアントが提供したリンクによって上書きされてはならない。
成功時、サーバーは必ず新しい URI を
Locationヘッダーに含めて 201 ステータスコードを返さなければならない。サーバーは必ずLinkヘッダーに
主要なサーバー管理のメタデータを含めなければならない。これには、親コンテナーへのリンク
(rel="up")と、作成されたリソース専用のリンクセットリソースへのリンク
(rel="linkset"; type="application/linkset+json")が含まれる。追加のリンクには原則としてrel="type"を含めるべきである(
https://www.w3.org/ns/lws#Containerまたは
https://www.w3.org/ns/lws#DataResourceを示す)。本文は任意で空にするか、
リソースの最小限の表現を含めてもよい。すべてのメタデータの作成とリンク付けは必ず整合性を維持するためにリソースの作成とアトミックに行わなければならない。
POST(コンテナー URI への要求) – サーバーが割り当てる名前で作成: POST を使用して、既存のコンテナー内に新しいリソースを追加する。サーバーが リソースの識別子を割り当てる。クライアントは、作成するリソースのタイプを次のように示す。
rel="type"を持つLinkヘッダーを含め、
Container タイプを指すようにしなければならない。
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の内容(買い物リスト)を提供する。/alice/notes/が存在し、
クライアントが認可されている場合、サーバーは新しいデータリソースを作成し、それをコンテナーのメンバー一覧に追加する。
例(POST への応答 — データリソース):
HTTP/1.1 201 Created
Location: /alice/notes/shoppinglist.txt
Content-Type: text/plain; charset=UTF-8
Link: </alice/notes/shoppinglist.txt.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/notes/>; rel="up"
Link: <https://www.w3.org/ns/lws#DataResource>; rel="type"
Content-Length: 0
成功時には、新しい URI をLocationヘッダーに含めて 201 Created を返す。本文は
空でも、最小限の表現でもよい。
対象のコンテナー/alice/notes/が存在しない場合、サーバーは
必ず別のステータスコードの方が適切でない限り、404 エラーステータスを返さなければならない。
コンテナーの作成: 新しいコンテナーを作成するには、クライアントは既存の親コンテナーに対して、Container
タイプを示すLinkヘッダーを
付けて POST を使用する。例:
POST /alice/ HTTP/1.1
Host: example.com
Authorization: Bearer <token>
Content-Length: 0
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
例(POST への応答 — コンテナー):
HTTP/1.1 201 Created
Location: /alice/notes/
Link: </alice/notes/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
Content-Length: 0
これにより、/alice/notes/に新しいコンテナーが作成され、サーバーによって生成された
rel="type"がhttps://www.w3.org/ns/lws#Containerであるメタデータも含まれる。
作成に関する追加の注記(HTTP バインディング):
Linkヘッダーに
rel="https://www.w3.org/ns/lws#storage"を含めて 401 応答で返し、
URI をハードコードしていないクライアントを案内すべきである。
メタデータの管理と取得(作成に関連):
メタデータは主に読み取り操作によって取得されるが、作成時に生成される。クライアントは
作成直後に新しいリソース URI に GET または HEAD を使用して取得できる。クライアントは
Preferヘッダーを使用して、特定のメタデータリンク(関係タイプによる)と
属性を含めるよう要求できる。
既存のリソースの表現、またはコンテナーの一覧を取得する。
リソースの読み取り操作は、HTTP GET 要求(ヘッダーのみの要求には HEAD)を使用してリソースの表現を要求する。
動作は、対象 URL がコンテナーであるか、コンテナー以外のリソース(データリソース)であるかによって異なる。サーバーは必ず
メタデータを通じてリソースのタイプを区別しなければならない。すべての応答は必ず
8.1 節で定義されるメタデータと統合しなければならず、これには
rel="linkset"、rel="up"、rel="type"などの主要な関係を示すLinkヘッダーが含まれる。サーバーは必ず読み取り時にリソースの状態とそのメタデータの間の原子性を保証しなければならない。
GET(コンテナー以外のリソース) – リソースの内容を取得する:
リソースの URI に GET を送信して、内容全体を取得する(認可されている場合)。200 OK で応答し、本文に
データを含め、Content-Type を保存されているメディアタイプに一致させる。サーバーは必ず
部分取得のために [RFC7233] に従った範囲要求をサポートしなければならない。
応答には必ず
[RFC9110] で定義されるETagヘッダーを含めなければならない。
例(ファイルの GET):
GET /alice/notes/shoppinglist.txt HTTP/1.1
Authorization: Bearer <token>
Accept: text/plain
これは/alice/notes/shoppinglist.txtの内容を要求し、クライアントが
テキスト形式で取得したいことを示す。リソースが存在し、テキストであり、クライアントにアクセス権があると仮定すると、次のようになる。
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 34
ETag: "abc123456"
Link: </alice/notes/shoppinglist.txt.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/notes/>; rel="up"
Link: <https://www.w3.org/ns/lws#DataResource>; rel="type"
milk
cheese
bread
guacamole
soda
chocolate bars
hash
eggs
サーバーはテキストの内容を返した(Content-Lengthが示すとおり、合計 34 バイト)。
内容はファイルに保存されているデータと完全に同一である。ETag: "abc123456"は、
キャッシュおよび条件付き要求のための検証子である。応答には
メタデータの発見可能性のためのLinkヘッダーが含まれ、upやtypeなどの必須フィールドを持つ。
GET(コンテナーリソース) – コンテナーの内容を一覧表示する:
対象 URI がコンテナーに対応する場合(メタデータのタイプによって判定される)、GET 要求は
コンテナーのメンバーの一覧を返す。
Content-Type: application/lws+jsonを持つ応答は、
コンテナー
表現であり、コンテナー
表現の節で定義される。この表現では、一覧に各メンバーのメタデータが含まれる。
リソースの識別子(必須)、タイプ(必須)、メディアタイプ
(DataResources では必須)、サイズ(推奨)、および
更新日時のタイムスタンプ(推奨)。
例(コンテナーの GET): コンテナーが存在し、クライアントにアクセス権があると仮定する。 タブには、異なるメディアタイプでの同じ要求が示される。12.1.2 コンテンツネゴシエーションを参照。
要求:
GET /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
Accept: application/lws+json
応答ヘッダー:
HTTP/1.1 200 OK
Content-Type: application/lws+json
ETag: "container-etag-789"
Link: </alice/notes/.meta>; rel="linkset"; type="application/linkset+json"
Link: </alice/>; rel="up"
Link: <https://www.w3.org/ns/lws#Container>; rel="type"
応答本文:
{
"@context": "https://www.w3.org/ns/lws/v1",
"id": "/alice/notes/",
"type": "Container",
"totalItems": 2,
"items": [
{
"type": "DataResource",
"id": "/alice/notes/shoppinglist.txt",
"format": "text/plain",
"size": 47,
"modified": "2025-11-24T12:00:00Z"
},
{
"type": ["DataResource", "http://example.org/customType"],
"id": "/alice/notes/todo.json",
"format": "application/json",
"size": 2048,
"modified": "2025-11-24T13:00:00Z"
}
]
}
要求:
GET /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
Accept: text/turtle; profile="https://www.w3.org/ns/lws/v1"
応答ヘッダー:
HTTP/1.1 200 OK
Content-Type: text/turtle; profile="https://www.w3.org/ns/lws/v1"
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"
応答本文:
@prefix lws: <https://www.w3.org/ns/lws#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<> a lws:Container ;
lws:totalItems 2 ;
lws:items <shoppinglist.txt>, <todo.json> .
<shoppinglist.txt> a lws:DataResource ;
dcterms:format "text/plain" ;
schema:size "47"^^xsd:long ;
dcterms:modified "2025-11-24T12:00:00Z"^^xsd:dateTime .
<todo.json> a lws:DataResource, <http://example.org/customType> ;
dcterms:format "application/json" ;
schema:size "2048"^^xsd:long ;
dcterms:modified "2025-11-24T13:00:00Z"^^xsd:dateTime .
この例では、/alice/notes/はコンテナーである。応答は
LWS コンテキストを使用した JSON-LD で、必須のメタデータとともにメンバーを一覧表示する。各項目にはtype、
id、format、size、modifiedのタイムスタンプがフラットな
プロパティとして含まれる。
いずれの場合も、サーバーは必ず応答ヘッダーに次のメタデータを含めなければならない。
[RFC9110] で定義されるETagヘッダーと、
rel="linkset"、rel="up"、rel="type"を持ち、それが
コンテナーであることを示すLinkヘッダー。
HEAD(任意のリソースまたはコンテナー) – ヘッダーとメタデータのみ:
LWS サーバーは必ずコンテナーと非コンテナーの両方について HEAD [RFC9110] をサポートし、
コンテナーと非コンテナーに対して、GET と同じヘッダーを返さなければならない。
(Content-Typeやメタデータ用のLinkを含む)が、本文は含めない。これにより、
内容を転送せずにメタデータを取得できる。
キャッシュと条件付き要求: LWS は HTTP のキャッシュセマンティクスを活用する。サーバーは原則として[RFC9110] で定義される条件付き要求をサポートすべきであり、
エンティティタグ(ETags)や日付ベースの検証子(
If-Modified-Sinceヘッダーなど)の仕組みを含む。リソースまたはコンテナーの一覧が
変更されていない場合は、不要な転送を避けるために304 Not Modifiedで応答する。
発見可能性と認可: 発見可能性を高めるため、
401 Unauthorized応答には、
resource_metadataパラメーターを持つWWW-Authenticateヘッダーが含まれる。これは認可サーバーの発見で説明されており、クライアントが
URI をハードコードせずに認可サーバーを特定できるようにする。
既存の[提供されるリソース]の状態を、完全な置換または部分的なパッチによって変更します。
リソースの更新は、PUT
リクエスト(リソース全体を置換する場合)または PATCH リクエスト(
部分的な変更を適用する場合)によって、既存の提供される
リソースの内容を変更します。これらの
操作を実行するには、クライアントがリソースの URL への書き込みアクセス権を持っていなければなりません。
注: この節では、リソースの主要な内容の更新について説明します。メタデータを更新するには、9.3.2節を参照してください。
LWS サーバーは、リソース URI に対する PUT および PATCH リクエストを、
関連付けられたリンクセットリソースに既定では影響を与えない、リソース内容のみの変更として扱わなければなりません。単一の原子的な操作で内容と
メタデータの両方を任意に更新するために、クライアントはリソース URI への PUT/PATCH リクエストに Link
ヘッダーを含め、優先指定
'Prefer: set-linkset'([RFC7240] で定義)を指定してもかまいません。この場合、
サーバーは、内容の変更を適用することに加えて、指定された Link ヘッダーをリンクセットの置換
(PUT の場合)または部分更新(PATCH の場合)として解釈しなければなりません。
この動作はサーバーにとって任意ですが、サポートする場合、意図しないメタデータの上書きを防ぐため、
Prefer ヘッダーを介して明示的に呼び出されなければなりません。複合更新をサポートしないサーバーは、その優先指定を無視しなければならないか、501 Not Implemented で応答しなければなりません。
PUT(リソース全体の置換) – 新しい完全な内容を
本文に入れ、一致する Content-Type(通常は既存の型と一致)とともにリソース URI に PUT を送信します。PUT は既存のリソースに対してべき等です。
クライアントは、同時変更の上書きを避けるため、
[RFC9110] で定義されている条件付きリクエストを使用するべきです。
例(PUT によるリソースの更新):
PUT /alice/personalinfo.json HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json
If-Match: "abc123456"
{
"name": "Alice",
"age": 30,
"city": "New London",
"state": "Connecticut"
}
この例では、クライアントは
/alice/personalinfo.json にある既存の JSON リソースを更新しています。以前の GET または HEAD リクエストから受信したエンティティタグ
(ETag)を含む If-Match ヘッダーを指定しています。サーバーはそれを
現在のエンティティタグ(ETag)と比較し、一致する場合は、指定された
JSON で内容を置換します。一致しない場合、サーバーは更新を拒否します(その間にリソースが
他者によって変更されたためです)。
成功応答: 更新に成功した場合、サーバーは 200 OK で応答し、
更新された表現または何らかの確認(新しい内容やその一部など)を含めることができます。
あるいは、本文なしで成功したことを示すために 204 No Content で応答することもできます
(特に、追加情報を伝える必要がない場合によく使用されます)。例:
HTTP/1.1 204 No Content
If-Match の前提条件が一致しなかった
場合(同時変更)、サーバーは 412 Precondition Failed で応答します。
リソースが存在しない場合、更新を目的とした PUT は 404 Not Found になります。
クライアントが認可されていない場合は 403 Forbidden(有効な
資格情報が提供されていない場合は 401 Unauthorized)です。リクエストペイロードが有効でない場合は 400 Bad Request
です。PATCH(部分更新) – HTTP PATCH メソッド [RFC5789]
を使用すると、クライアントは新しい
コンテンツ全体を送信する代わりに、リソースに対する部分的な変更を指定できる。これは、変更されたのが
ごく一部だけである場合にコンテンツ全体を送信すると非効率になる大きなリソースや、特定の変更を適用したい並行編集に有用である。LWS
サーバーは、最低限 JSON Patch をサポートしなければならない
(application/json-patch+json)。これは [RFC6902] で定義されている。
リソースメタデータの更新(リンクセットに対する HTTP PUT / PATCH) リソースのメタデータは、Link ヘッダーの rel="linkset" を介して検出される、対応するリンクセットリソースを 変更することで更新されます。 完全な置換(PUT): 完全な リンクセット文書を本文に含む、リンクセットリソース URI への PUT リクエストは、リソースのすべてのメタデータを置換します。 部分更新(PATCH): リンクセットリソース URI への PATCH リクエストは、特定のリンクを追加、削除、または 変更します。
メタデータの条件付きリクエスト
リソースのメタデータは複数の主体によって変更される可能性があるため、同時上書きを防ぐことが
重要です。サーバーとクライアントは、リンクセットリソースに対する PUT および PATCH 操作について、
[RFC9110] で定義されている条件付きリクエストを使用するべきです。サーバーが前提条件を満たさない条件付き
リクエストを受信した場合、412 Precondition Failed ステータスコードでそのリクエストを拒否しなければなりません。
例(リンクセットを置換する PUT):
クライアントはまずリンクセットを取得します。
GET /alice/personalinfo.json.meta HTTP/1.1
Authorization: Bearer <token>
Accept: application/linkset+json
HTTP/1.1 200 OK
Content-Type: application/linkset+json
{
"linkset": [
{
"anchor": "/alice/personalinfo.json",
"describedby": [ { "href": "/schemas/personal-info.json" } ]
}
]
}
クライアントは次にライセンスを追加しようとします。新しい完全なリンクセット文書を構築し、PUT リクエストを送信します。
PUT /alice/personalinfo.json.meta HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/linkset+json
{
"linkset": [
{
"anchor": "/alice/personalinfo.json",
"describedby": [ { "href": "/schemas/personal-info.json" } ],
"license": [ { "href": "https://creativecommons.org/licenses/by/4.0/" } ]
}
]
}
成功した場合、サーバーは成功を示す応答を返します。
HTTP/1.1 204 No Content
更新規則の概要 リソースの内容のみを変更する場合 → リソース自体に PUT/PATCH を行います。 リソースのリンク(メタデータ)のみを変更する場合 → リソースに関連付けられたリンクセットリソースに PUT/PATCH を行います。 内容とリンクの両方を変更する場合 → 適切な Link ヘッダーと 'Prefer: set-linkset' の両方を含めて、リソース自体に PUT/PATCH を行います。両方の設定は既定では無効です。
リソースおよびそれに関連付けられたメタデータを完全に削除します。
リソース削除操作は、上記の抽象操作で定義されているように、HTTP DELETE メソッドを使用して実装されます。 この節では、入力、動作、および応答の HTTP バインディングを規定します。
DELETE リクエストは、削除するリソースまたはコンテナーの URI を対象とします。クライアントは、同時実行
チェックのために ETag を指定した If-Match ヘッダーを含めてもかまいません。
削除と包含:
リソースが削除されるとき、サーバーは、その
親コンテナーの items リストから、そのリソースを原子的に削除しなければなりません。親コンテナーの
totalItems の数も、それに応じて更新することが推奨されます。
コンテナー以外のリソースの場合、サーバーはリソースの内容、関連付けられたメタデータ(リンクセットリソース)、および親コンテナー内の包含参照を 削除します。
コンテナーリソースの場合、サーバーは既定で非再帰的
削除を行います。コンテナーが空でなく、再帰処理が要求されていない場合、サーバーは
409 Conflict でリクエストを拒否しなければなりません。サーバーは、削除対象のコンテナー内に含まれる
すべてのリソースの再帰的削除をサポートしてもかまいません。クライアントは、
[RFC4918]
で定義されているように、再帰的削除を要求するために
Depth: infinity ヘッダーを使用しなければなりません。
成功した場合、サーバーは 204 No Content で応答しなければなりません。サーバーは、 [RFC9110] で定義されている条件付きリクエストをサポートすることが推奨されます。
クライアントに認可がない場合、サーバーは 403 Forbidden(クライアントの 識別情報は既知だが権限が不十分な場合)または 401 Unauthorized(有効な 認証が提供されていない場合)を返さなければなりません。リソースの存在を明らかにすることがセキュリティリスクとなる場合、 サーバーは代わりに 404 Not Found を返してもかまいません。
例(コンテナー以外のリソースを DELETE):
DELETE /alice/notes/shoppinglist.txt HTTP/1.1
Authorization: Bearer <token>
If-Match: "abc123456"
ETagが一致し、クライアントが認可されていると仮定すると、サーバーはリソース、そのメタデータを削除し、
親コンテナ/alice/notes/からそれを原子的に削除する:
HTTP/1.1 204 No Content
例(再帰なしで空でないコンテナをDELETEする):
DELETE /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
/alice/notes/がリソースを含むと仮定すると、サーバーは削除を拒否する:
HTTP/1.1 409 Conflict
Content-Type: text/plain
Cannot delete container /alice/notes/ - container is not empty.
例(サポートされる場合、再帰でコンテナをDELETEする):
DELETE /alice/notes/ HTTP/1.1
Authorization: Bearer <token>
Depth: infinity
サーバーが再帰をサポートし、クライアントがすべての内容に対する権限を持つと仮定すると、サーバーは コンテナとその子孫を原子的に削除する:
HTTP/1.1 204 No Content
この表は、一般的な LWS の応答( 8節)を、一貫性を保つために HTTP ステータスコードおよびペイロードに対応付け、ページネーション、 条件付きリクエスト、クォータ制約、メタデータ統合などの具体的なシナリオを組み込んだものです:
| LWS 応答 | HTTP ステータスコード | HTTP ペイロード |
|---|---|---|
| 成功(読み取りまたは更新で、 データを返す場合) | 200 OK |
応答本文内のリソース
表現(GET の場合、または PUT/PATCH が内容を返す場合)と、関連するヘッダー
(Content-Type、rel="linkset" や rel="up" などの
メタデータ用 Link)を返します。コンテナー一覧の場合は、
規範的なコンテキストとメンバーメタデータ(ID、型、サイズ、タイムスタンプなど)を含む JSON-LD を含めます。
|
| 作成済み(新しいリソース) | 201 Created |
通常、応答本文はありません(または新しいリソースの最小限の表現)。新しいリソースの URI が
Location ヘッダーに設定されます。サーバー管理メタデータ用の Link ヘッダー。
|
| 削除済み(返す内容なし) | 204 No Content |
応答本文はありません。リソースが削除されたか、リクエストが成功し、
それ以上返す内容がないことを示します。サーバーは、完全な削除に 410 Gone を使用してもかまいません。
|
| 不正なリクエスト(無効な入力または制約) | 400 Bad Request |
何が誤っていたかを説明するエラーの詳細。サーバーは、
"type"、"title"、"status"、
"detail"、"instance" などのフィールドを持つ JSON オブジェクトのような
構造化エラー応答には、[RFC9457] で定義されている
標準形式を使用することが推奨されます。
|
この節では、Linked Web Storageサーバーによって管理されるリソースへの変更に関する更新を、 クライアントが適時に受信するためのメカニズムを定義する。この仕様は共通の 通知データモデルおよびサブスクリプションメカニズムを定義する。具体的な配信チャネルについては、 個別の通知スイート仕様で説明する。
ストレージは通知に対応してもよい。通知に対応するストレージには、必須として、
サービスオブジェクトを自身のservice配列内で公開することが求められる。この配列は、ストレージ記述
リソース内にあり、オブジェクトのtypeはNotificationServiceと等しい。
サービスオブジェクトは、serviceEndpointプロパティを含むことが必須であり、その
値は、
サブスクリプションエンドポイントのURIである。サービスオブジェクトは、次を含むことが必須である:
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アクティビティで使用される。
サーバーは、Storage Resource の変更を示すために、 以下の Activity Streams 2.0 activity type をサポートしなければならない。
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)の概念に基づいています。 他のプロファイルでは、異なる概念的枠組みを使用できます。
ストレージは、アクセス要求および
アクセス許可への対応を、
自身のストレージ記述リソースで通知してもよい。このような対応が
通知される場合、サービス
オブジェクトで、アクセス要求用のエンドポイントを記述するものは、必須として、
typeが文字列AccessRequestServiceと等しくなければならず、
サービスオブジェクトで、アクセス許可用のエンドポイントを記述するものは、必須として、
次を持たなければならない:
文字列AccessGrantServiceと等しいtype。サービス
オブジェクトは、conformsToプロパティを含むことが推奨される。その値は、
コレクションであり、
1つ以上の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/"
},
{
"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 型の resource に一致する。
https://www.w3.org/ns/lws#Container —
lws:Container 型の resource に一致する。
https://www.w3.org/ns/lws#StorageResource —
あらゆる Storage Resource に一致する。
サーバーは追加の type 値をサポートしてもよい。
このプロパティは OPTIONAL である。
{
"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"]
}
]
}]
}
すべての Storage Resources は、type 値を示す link header を 含む。
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メディアタイプは、
W3Cの制御識別子文書[CID-1.0]を LWS
語彙で拡張した特化文書を識別する。
LWS のコンテナー表現は必ずメディアタイプapplication/lws+jsonをサポートしなければならない。
LWS のコンテナー表現は JSON-LD の規約を使用するが、LWS に固有の制約と要件により、 専用のメディアタイプを使用することが正当化される。
URI https://www.w3.org/ns/lws/v1はLWS プロファイル[RFC6906]を識別する。コンテナーの表現がLWS プロファイルに適合するのは、
同じコンテナーの状態とページのapplication/lws+json表現と
RDF 同型である場合である。すなわち、エンコードされた RDF が、
RDF データセットの
比較[RDF12-CONCEPTS]で定義されるように、
application/lws+json表現を JSON-LD として解釈したときにエンコードされる RDF と同型である場合である[JSON-LD11]。application/lws+json
表現は常にLWS プロファイルに適合する。
サーバーは必ずコンテナーに対するapplication/lws+jsonの要求に応じ、
必ず応答のContent-Typeヘッダーを選択された表現のメディアタイプに設定しなければならない。
クライアントは、RDF メディアタイプのprofileパラメーターにLWS プロファイルの URI を含めることで、
LWS プロファイルに適合する表現を要求する。
このパラメーターを定義する RDF メディアタイプには、application/ld+json
[JSON-LD11]、text/turtle[RDF12-TURTLE]、application/trig[RDF12-TRIG]、application/n-triples[RDF12-N-TRIPLES]、およびapplication/n-quads
[RDF12-N-QUADS]がある。サーバーがそのようなメディアタイプを選択した場合、
応答は必ずLWS プロファイルに適合しなければならない。
つまり、application/lws+json表現と必ずRDF 同型でなければならず、
そのContent-Typeには必ず同じ
profileパラメーターを含めなければならない。サーバーは、そのメディアタイプで
LWS プロファイルに適合する表現を生成できない場合、
そのメディアタイプを選択してはならない。
選択される表現が要求のAcceptヘッダーに依存する場合、応答には原則としてVary: Acceptヘッダーを含めるべきである[RFC9110]。
コンテナーなどの一部の複合リソースには、多数のリソースが含まれる場合がある。 クライアントが一覧を段階的に取得できるようにするため、サーバーは原則として、 メンバー数がサーバーによって決定されたしきい値を超えるコンテナーについて、ページネーションをサポートすべきである。
ページネーションはリンクベースである。サーバーは 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]に従って検証できる。 実装上のセキュリティに関する考慮事項は、「トランスポート 層セキュリティ(TLS)およびデータグラムトランスポート層セキュリティ(DTLS)の安全な使用に関する推奨事項」[RFC9325]を参照。
この節は非規範的である。
Bearerトークンおよびデジタル資格情報は、盗難やリプレイに対して脆弱である。緩和策には、 適度に短い有効期間の使用、特定の対象者へのトークンのバインディング、およびトークンの安全な保存が含まれる。
aud
クレームを用いることで、別のサーバーへのトークンのリプレイを防ぐ。アクセストークンの
対象者に、
複数のサーバーが含まれる場合、それらのいずれのサーバーも他のサーバーに対してリプレイできる。認可
サーバーは、これを回避するため、
単一のストレージURIを対象者とするトークンを発行する。資格情報を扱うアプリケーションで、
その
対象者が制限されていない場合、これらの資格情報を他のエンティティに送信する際には注意が必要であり、
特に信頼されていない
認可サーバーへの送信には注意が必要である。資格情報の発行者がトークンの対象者を制限できない場合、クライアントは、
次のような
仕組みを使用できる:OAuth 2.0 トークン交換[RFC8693]。これにより、
対象者を制限した資格情報を作成してから、
異なるセキュリティドメインの認可サーバーとやり取りできる。
dpop_signing_alg_values_supportedおよび
dpop_bound_access_tokens_requiredパラメーターを使用する。これらは[RFC9728]で定義されている。
localStorage、URL、
またはログに保存すると、そのトークンは流出攻撃を受けやすくなる。
この節は非規範的である。
クライアントは、ストレージサーバーから送信されたレスポンスから認可サーバーの場所を知るが、そのストレージサーバーを クライアントは、 信頼していない可能性がある。この検出プロセスには、以下の考慮事項が適用される。
LinkヘッダーからストレージURIを取得する。その送信元は、
ストレージ
サーバーである。悪意あるサーバーは別のストレージのURIを提供し、クライアントに取得させることができる:
アクセストークンを、
そのストレージ用に。そして悪意あるサーバーに提示させ、そのサーバーはトークンをリプレイできる。このため、
クライアントには、
ストレージ記述を使用して確認することが要求される:
要求先URIが同一オリジンから提供されていることを、
ストレージルートと比較して、アクセストークンを要求する前に。これは、
次で説明されている:
5.2.3
クライアントによる検出結果の検証。
resource_metadata URL、ストレージURIで、
Linkヘッダー内にあるもの、および保護されたリソースのメタデータ文書内の発行者識別子は、
選択される:
ストレージサーバーによって。そしてクライアントは、それらが識別する文書を取得する。この
取得を代理で実行するクライアント、
例えばサーバーサイドアプリケーションのように他の主体の代理で実行するものは、サーバーサイドリクエストフォージェリにさらされる。これは、
次で説明されている:
[RFC9728]の7.7節。予防措置には、
取得をhttpsスキームに制限すること、および
内部IPアドレス範囲へのリクエストをブロックすることが含まれる。
この節は非規範的である。
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実装には、 固有のメディアタイプを使用することを正当化する多数の制約および追加要件があることに注意されたい。
本仕様は、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:
Referenced in:
Referenced in:
Referenced in: