I think it would help to think about macaroons as macaroons rather than
something that borrows concepts from JOSE or jti.
In macaroons, you are proving authorization by presenting a tree of
macaroons with your request. The macaroons tree can only be verified
by passing in the secret used to first create the macaroon at the root
of the tree. The identifier is a non-secret way to recover that secret.
Server-side, you have some collection of secrets and need some way to
pick which secret should be used for a given request.
Many people have begun using the identifier with public key crypto to
generate these secrets, but that's just one way you could use it.
Others include:
- A key-value store that embeds one secret per key-value pair
- A distributed filesystem that uses macaroons to protect raw storage
on the storage nodes to keep them simple and safe
- Put the secret on an object that represents a user's account.
The general pattern comes down to picking the resource you want to
protect (e.g., kv pairs, storage blocks, users, repositories) and having
one secret per instance of that resource. The identifier then acts as a
way to make sure you fetch the right resource (although in many cases
you could probably ignore the identifier and use the only pertinent
secret available).
-Robert