I'm not quite sure the author of the article has a solid grasp of JWT, or identity federation in general given that he compares JWT to cookies (it's more like SAML than anything else). I'd highly recommend giving the RFC [1] a once-over to see what the spec is
really about.
> The correct comparisons are "sessions vs. JWT" and "cookies vs. Local Storage".
This is somewhat true, but flawed. The better comparison is "SAML vs JWT," or "CAS vs JWT." JWT is a claim assertion standard (most often used for ID claims), and should not be compared with sessions in any way. A JWT (signed by a trusted authority) is a valid way to start a session, or to hold and transmit data for sessionless communication.
> They really aren't [easier to use].
Maybe not compared to cookies, but they definitely are easier than SAML2, which they ought to replace.
> I have yet to see somebody actually explain how JWT is more flexible.
They have flexible claims which require no DTD; SAML does not. Cookies support this too, but they really shouldn't be part of the discussion.
> Server-side expiration is preferable, in fact - it allows your application to clean up session data that it doesn't need anymore
The best part of signed tokens (if you don't mess with revocation) is that you don't remember any data. You perform an identity lookup, authenticate the user, generate and sign the token, and send it off. No need to keep any data around at all, much less handle the complexity of cleaning it up.
> It doesn't, really. There are roughly two ways to store a JWT:
The way JWT solves CSRF is not by the way it's stored; it's by the way it's transmitted in an Authorization header, which can't be done cross-domain and won't be included by the browser (as cookies would). If you're not using JS, you shouldn't be looking at JWT at all; it's useless without it.
> Users don't just block cookies, they typically block all means of persistence.
Unless they're blocking JS (which would render the whole article moot anyway), then there's memory persistence for as long as the browser hasn't refreshed. This is more than enough persistence to realize the benefits of JWT (talking to multiple backends, SPA experience, etc.) Yeah, it's gone when you refresh or navigate away, but some might call that a feature. Just re-authenticate with the JWT provider and keep going.
> JWT tokens are not exactly small.
They're as small as a secure cookie: metadata header + data + signature. That's it. And they don't need to be communicated as part of the URL (though it's deliberately safe to do so), and should not be communicated via cookie (eliminates CSRF benefit).
> They are less secure
Not if they're signed and validated against trusted issuers. Which they should be. Heck, they'll even be encryptable (in a standardized way) soon. [2] Then even the browser they're sent to can't see what they contain unless it has the private key.
> You cannot invalidate JWT tokens
Yes, you can. Use revocation and check with the authority. Just because it's not specified doesn't mean you can't use long-standard methods (see CRL [3]) to achieve your design requirement.
> Implementations are less battle-tested or non-existent
As with any new technology, implementations are also new. Just like I don't have 5 years of experience with Angular 2. And a quick glance at jwt.io will show you that there are plenty of implementations available for a huge swath of languages.
Seriously, read the spec, know your use cases (JWT is not a session replacement, though it could function similarly), and learn the crypto primitives that make this secure (JWT provides verifiable integrity via signatures, not confidentiality (yet) and leaves that to other layers (until JWE)).
[1] https://tools.ietf.org/html/rfc7519
[2] https://tools.ietf.org/html/draft-ietf-jose-json-web-encrypt...
[3] https://www.ietf.org/rfc/rfc5280.txt