最近寫的後端都改成用token做認證

主要是因為比用傳統的cookie認證還要多一些好處

這篇稍微簡單記錄一下

Token vs. Cookie

下面這張是token跟cookie的比較

token vs cookie

用cookie是server會在認證成功的response header裡面加一個set-cookie,然後client每次request的時候把cookie放在header裡

用token則是在response的時候回傳token,然後之後request時把token放在header的Authentication欄位裡面

乍看之下滿像的,但是用token當做認證的媒介多了一些好處:

Stateless

用cookie認證的時候,server通常會需要存一個session在memory裡。而token本身就可以帶有一些簡單的資訊,這樣server就不需要維護session,也就是server本身是stateless的。

這樣會帶來一個很大的好處,就是server的scalability,假設後端server要從一台擴充成三台,就不用煩惱每台之間的session問題了。

Multiple Platforms and Domains

因為cookie只能在同一個domain下使用,使用起來就會有很多限制,像是我就不能在api.gordon.com放一個RESTful api的server然後在app.gordon.com跟他拿資料。

如果是用token,就可以弄一個只有api的server然後從任何地方拿到資料。而且如果你想要從web轉到app,用token也是輕鬆處理,不用煩惱後端的問題。

Json Web Token

Json web token(jwt) 是一種產生token的標準,也是大家最常拿來做token based authentication的方式

他會用一個字串當做secret去encode你要帶的資料

產生的token的格式是這樣 <header>.<payload>.<signature>

  • header記錄他用的演算法
  • payload就是你想要帶的資料
  • signature是拿來驗證token合不合法的

下面是一個例子,用的secret是”secret”

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImdvcmRvbiIsInJvbGUiOiJhZG1pbiJ9.5SJm6PjTWG48a059LDOFiqFgaX6GUMd-9D7PJv8LRkg

他decode出來會得到這個

1
2
3
4
{
"username": "gordon",
"role": "admin"
}

所以我只要拿著這個token,我的server就可以認出我是gordon這個使用者,而且擁有admin權限。

結語

這篇只有簡單介紹什麼是token based authentication

還有很多實做的細節沒提到,像是:

  • client要怎麼存token
  • 如果使用者登出了,要怎麼讓token失效
  • 安全性的問題

關於token vs cookie的議題最近的討論滿多的

reddit上也滿多這方面的爭議的

有空再來做個整理好了

參考資料

The Ins and Outs of Token Based Authenticatoin

Token Based Authentication for Single Page Apps

Introduction to JSON Web Tokens