Comparisons

Ten pairs that get conflated in real conversations. Neither column wins — what decides is the requirement. Each record leads with the confusion, because the confusion is the reason the record exists.

Server sessions vs Tokens

What people get wrong about this pair

That a token is "stateless" is read as "no state anywhere". The state moved to the client, and with it the ability to revoke: a signed token stays valid until it expires, so real revocation means keeping a denylist — which is state again, just less obvious.

Server-side session
Use it when

First-party web apps where you want immediate revocation and are happy to look up state on each request.

Self-contained token (e.g. a signed JWT)
Use it when

Service-to-service calls and clients where a lookup per request is unwelcome, and where a short expiry is an acceptable revocation story.

DimensionServer-side sessionSelf-contained token (e.g. a signed JWT)
Where the truth livesServer store keyed by session idInside the token, signed
RevocationDelete the record; effective immediatelyNot until expiry, unless you add a denylist
Per-request costA lookup in the session storeA signature verification
ScalingStore must be shared across instancesNo shared store needed for verification
Payload changesTake effect on next requestTake effect only when a new token is issued
Leak impactSession id useful until revokedToken useful until it expires, everywhere it is accepted