SPIFFE
The de facto workload identifier reused by the IETF agent architecture draft, cloud agent-identity products and agent gateways.
Flows / No human
Every agent process gets a cryptographic identity from the infrastructure it runs on, and uses it to authenticate both ends of every connection.
SPIFFE is a set of open specifications for giving software an identity without giving it a secret. Each workload gets a name, a SPIFFE ID such as spiffe://example.org/ns/agents/sa/research-agent, and a short-lived credential that proves the name: an X.509 certificate or a JWT, called an SVID.
The workload does not log in to get it. It asks a local agent over a Unix socket, and the local agent works out who is asking by inspecting the calling process: which pod, which service account, which container image. Identity is derived from what the workload is, checked by something outside it.
For agent systems this gives you a per-workload identity that works the same across clusters and clouds, authenticates both sides of a connection, and rotates without anyone noticing. Service meshes use the same identities under the hood.
8 steps between 4 parties. Each step shows the message and who holds which credential afterward. Use ←→ or select any arrow.
Drag to see every party and step. Tap a step to jump to its explanation.
Before any workload gets an identity, the SPIRE agent on each node proves its own to the SPIRE server, using evidence the platform provides: on Kubernetes a projected service account token, on a cloud VM a signed instance identity document.
Registration entries map selectors to SPIFFE IDs: “a pod in namespace agents with service account research-agent is spiffe://example.org/ns/agents/sa/research-agent.”
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The agent connects to the Workload API on a local Unix domain socket. It sends no password, token or key. This is the answer to the bootstrap problem: how do you authenticate a workload that has no credential yet?
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
From the socket it learns the caller’s process ID. From the kernel and the kubelet it learns which container and pod that process belongs to, its service account, labels and image. It matches those facts against the registration entries.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The certificate carries the SPIFFE ID in its URI subject alternative name. It typically lives for an hour or less and is pushed again over the same stream before it expires. The trust bundle is the set of CA certificates for verifying peers.
Subject Alternative Name:
URI: spiffe://example.org/ns/agents/sa/research-agent
Validity:
Not After: +1hWho holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The agent presents its SVID as a client certificate. The tool service presents its own. Each verifies the other against the trust bundle. The connection is authenticated in both directions before any application data flows.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
The tool, or a sidecar or mesh proxy in front of it, reads the peer’s SPIFFE ID and decides whether that identity may call this endpoint.
allow:
- from: spiffe://example.org/ns/agents/sa/research-agent
to: [ "POST /tools/search", "POST /tools/summarize" ]Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
If the call is on behalf of a user, the request carries an access token as well. Workload identity for the hop, user delegation for the request: the two layers answer different questions and are stronger together.
Who holds what after this step
Parties not listed hold none of this flow’s credentials at this point.
When a load balancer or gateway terminates TLS, the certificate does not reach the application. SPIFFE also issues JWT-SVIDs: signed tokens with the SPIFFE ID as subject and a specific audience, sent in a header. They are bearer tokens, so keep them short-lived and audience-bound. The IETF WIMSE work adds proof-of-possession for this case; see workload tokens.
See the full tracker for status and links.
What the flow implements, shows in a step, or must support. These decide its maturity rating.
Variants and additions the page mentions. No step depends on them, and the flow does not require them.
Sender-constraining for agents that already have workload certificates.
Secretless OAuth client authentication for agents that already have a workload identity.
Related reading. Not what the flow implements, and not used in a step.
Includes a section on agents: each hop in an agent chain must explicitly scope and re-bind the security context.
Your agent uses an identity established by its runtime to obtain short-lived access from a system that trusts that identity.
A workload identity that is bound to a key and proven on every request, so it survives the gateways and proxies that agent traffic passes through.
Inside your own infrastructure, replace the access token with a short-lived token that pins down one transaction and travels the whole call chain.
The agent authenticates as itself. No user, no consent screen, no one to ask.