Skip to main content

Early Review of draft-ietf-oauth-sd-jwt-vc-18
review-ietf-oauth-sd-jwt-vc-18-httpdir-early-nottingham-2026-08-12-00

Request Review of draft-ietf-oauth-sd-jwt-vc
Requested revision No specific revision (document currently at 18)
Type Early Review
Team HTTP Directorate (httpdir)
Deadline 2026-08-28
Requested 2026-08-07
Requested by Deb Cooley
Authors Oliver Terbu , Daniel Fett , Brian Campbell
I-D last updated 2026-08-10 (Latest revision 2026-08-03)
Completed reviews Httpdir Early review of -18 by Mark Nottingham
Comments
Nothing specific, I just want this done sooner than later.
Assignment Reviewer Mark Nottingham
State Completed
Request Early review on draft-ietf-oauth-sd-jwt-vc by HTTP Directorate Assigned
Reviewed revision 18
Result Almost ready
Completed 2026-08-12
review-ietf-oauth-sd-jwt-vc-18-httpdir-early-nottingham-2026-08-12-00
*[Drafted with AI assistance from a structured review run over the document and
the WG's record, then reviewed and edited by me.]*

The draft is reasonable where it touches HTTP. It uses GET throughout, puts key
material behind HTTPS rather than in the DNS, and uses the
discovery-document-plus-links pattern RFC 9205 recommends. The `.well-known`
construction in Section 3 is correct.

The problem is that it specifies requests but is almost silent about responses.
It defines four fetches -- the `/.well-known/jwt-vc-issuer` document,
`jwks_uri`, Type Metadata from `vct` and `extends`, and the logo / background /
SVG-template `uri`s -- and gives partial HTTP behaviour for two. Issues 1 to 5
all follow from that.

This WG has already done most of the relevant analysis in
draft-ietf-oauth-client-id-metadata-document: redirects, server-side request
forgery (SSRF) and special-use addresses, HTTPS versus `data:`, cache headers.

# Issues

**1. Redirect handling is unspecified**

"redirect" and "3xx" don't appear in the document. RFC 9205 Section 4.6.1 asks
applications to say whether redirects are followed, because user agents may or
may not follow them.

Section 6.1 specifies a check performed *before* the request -- "Before making
a request to the JWT VC Issuer Metadata endpoint, the Holder or Verifier MUST
validate the URL...". A 3xx arrives after that check has passed.

The document needs to say (probably globally) whether redirects are followed
and under what constraints, and apply the Section 6.1 validation to each URL
actually connected to, not just the first.

**2. Rendering URIs are underspecified**

The rendering URIs get very little specified HTTP behaviour: no method, status,
media type, size or time bound, no scheme constraint. Is an `http:` logo URI
conformant? Section 4.5.1.2.2 covers references out of the SVG -- "consuming
applications MUST ensure that references to external resources (images, etc.)
from within the SVG cannot be used to track users or the usage of credentials"
-- but says nothing about the fetch of the SVG itself. Section 7.4 is scoped to
the Type Metadata document, not the resources it points at.

Restating Section 6.1's requirements once, generally, for every URL the
specification causes a Consumer to dereference would some of this. Constraining
the rendering URIs to `https:` or `data:` would also help.

**3. Pinning success to 200.**

Sections 3.2 and 4.3.1 both say "A successful response MUST use an HTTP 200
status code". RFC 9205 Section 3.1 asks applications not to overlay the
semantics of generic protocol elements.

Instead, describe the semantics -- a representation of the metadata resource,
retrieved with GET -- rather than pinning a status code.

**4. The caching rule is incomplete.**

   Otherwise, the Consumer MUST use the Cache-Control header of the HTTP
   response to determine how long the metadata can be cached.

Cache-Control isn't the only input to the HTTP caching model. Point at RFC 9111
instead. Also tell publishers to send an explicit freshness lifetime, and say
whether the integrity-keyed indefinite cache overrides origin directives such
as `no-store`.

**5. The integrity mechanism is specified by reference to an algorithm that
fails cross-origin.**

Section 5 requires a Consumer to "MUST verify the integrity of the retrieved
document as defined in Section 3.3.5 of [W3C.SRI]". Step 3 of that algorithm is
"If response is not eligible for integrity validation, return false", and
Section 3.3.2 makes eligibility depend on the response being same-origin or
CORS-permitted. Every URL this document integrity-checks is cross-origin by
construction, and CORS is never mentioned.

So in a browser-hosted wallet the cited algorithm returns false, Section 5's
MUST fails, and Section 4.7 rejects the credential. In a native consumer
there's no Fetch response and no loading origin, so step 3 has no meaning and
every implementer will quietly skip it.

If browsers are in scope, this needs an `Access-Control-Allow-Origin`
requirement on the fetched documents. If not, cite SRI for the syntax of the
integrity-metadata string and specify the digest comparison in your own words.
Note also that the cited section doesn't survive into SRI 2, so the reference
is to a form of the algorithm current SRI no longer contains.

**6. `vc+sd-jwt` is now assigned to someone else.**

Section 2.2.1 says "both vc+sd-jwt and dc+sd-jwt should be accepted as the
value of the typ header for a reasonable transitional period". Is this intended
to go into the permanent RFC, or will it be removed?

# Comments

- No normative reference to RFC 9110 or RFC 9111, though the document specifies
GET, status codes, a content type and `Cache-Control` behaviour. Same for RFC
3986, given Section 3's "scheme, host and, optionally, port number and path
components, but no query or fragment components".

- `jwks_uri` is defined and never specified: no method, status code, content
type, caching or integrity, and Section 6.1 doesn't reach it. If that's
deliberate deferral to RFC 7517, say so.

- `nosniff` and `Content-Security-Policy` appear nowhere. RFC 9205 Section 4.13
names them as response-side mitigations for the active-content risk Sections
4.5.1.2.2 and 6.5 address entirely on the client side. Your resources remain
reachable by a browser whether or not that's intended.

- No response message appears anywhere: Figures 12 and 13 are two-line
requests, Figures 14, 15 and 17 are bare JSON. RFC 9205 Section 4.1 asks for
both request and response with complete header sections. RFC 8414 Section 3.2
and RFC 9728 Section 3.2 both show one, and it's the artefact that would have
surfaced issues 3 and 5.

- Distinct media types for the two metadata documents over `application/json`
would have been nice, per RFC 9205 Section 4.8, but I see this was raised in
issue #388.

- Section 6.1 uses "internal" three times and defines it nowhere.
draft-ietf-oauth-client-id-metadata-document cites RFC 6890 for the same
requirement.

# Nits

- Section 1.3 uses the pre-RFC 8174 boilerplate. Note there is a lowercase
"should" in Section 2.2.1.

Cheers,