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
REST API och JSON Web Tokens (JWT)
By antonledstrom
REST API och JSON Web Tokens (JWT)
- 738