REST API och JSON Web Tokens (JWT)

Autentisering:

Cookies vs JSON Web tokens

bild från: https://docs.google.com/drawings/d/1wtiF_UK2e4sZVorvfBUZh2UCaZq9sTCGoaDojSdwp7I/edit

Cookie autentisering

  • Lagrar ett Sessions-id.
  • Söker upp användaren i databasen i varje förfrågan.
  • All sessions information hanteras server side.


Server
 

Sessions lagring

Server
Server
Server​

Sessions lagring

bild från: https://docs.google.com/drawings/d/1wtiF_UK2e4sZVorvfBUZh2UCaZq9sTCGoaDojSdwp7I/edit

JWT autentisering

  • Returnerar en JWT vid en lyckad inloggning
  • Validerar token vid varje förfrågan.

Vad är en JWT?

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzb21lX2lzc3VlciIsImV4cCI6MTUwMDgxOTM4MCwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.KRBf-VIq_1cPg2hiSW_WOuChVIwoeXVhPC3vAaCxatM

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzb21lX2lzc3VlciIsImV4cCI6MTUwMDgxOTM4MCwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.KRBf-VIq_1cPg2hiSW_WOuChVIwoeXVhPC3vAaCxatM

Header

Payload

Signature

Header

var header = {
  "typ": "JWT",
  "alg": "HS256"
}; 

Payload

var payload = {
  "iss": "some_issuer",
  "exp": 1500819380,
  "name": "John Doe",
  "admin": true
}; 

Signature

var signature = 
    HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload),'secret');

JWT

var JWT = base64UrlEncode(header) +"."+ base64UrlEncode(payload)+"."+ signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzb21lX2lzc3VlciIsImV4cCI6MTUwMDgxOTM4MCwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.KRBf-VIq_1cPg2hiSW_WOuChVIwoeXVhPC3vAaCxatM

HTTP Request Header

Authorization: BEARER 

eyJhbGciOiJIUzI1NiIsInR5cCI
6IkpXVCJ9.eyJpc3MiOiJzb21lX2lzc3VlciIsImV4cCI6MTUwMDgxOTM4MCwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.KRBf-VIq_1cPg2hiSW_WOuChVIwoeXVhPC3vAaCxatM

Fördelar med en JWT

  • Statelesss
    • En JWT är fristånde.
  • CSRF
    • Ingen authentication cookie ingen CSRF.
  • CDN
    • En CDN kan servera all html, javascript etc och servern är endast ett API. 

Fördelar med en JWT

  • Testning
    • Med en förenklad login procedur förenklas testning.
  • Prestanda
    • En HMACSHA256 bör vara snabbare än att leta reda och validera sessionen.

Fördelar med en JWT

  • Standard
    • Med ett relavtivt stort stöd från backend, .NET, Ruby, Java , Phyton, PHP
    • och företag, bla Microsoft, Firebase, Google 
  • Frikopplad
    • JWT kan genereras vart som helst

Att tänka på

  • Base64 är inte säkert, om payloaden innehåller känslig information använd JSON Web Encryption.
  • Använd befintliga server side bibliotek
  • Skydda din SECRET
  • Ingen sessionstorage ingen möjlighet att "förstöra" JWT

Tack

Referenser

http://jwt.io/

https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/


Av: Anton Ledström

Made with Slides.com