jwt認證

問題: 判斷一個用戶是否已經受權登陸後端

方法1: cookie

用戶經過用戶名和密碼登陸成功以後,服務端往客戶端設置cookie  islogon=1,api

問題: 客戶端能夠隨意僞造這些信息,不安全跨域

 

方法2: session

用戶經過用戶名和密碼登陸成功以後,服務端爲該用戶生成一個sessionid,設置session["islogon"]=1,服務端服務端往客戶端設置cookie  sid=sessionid安全

下次客戶端訪問會帶上cookie  sid=sessionid,後端根據sid索引到登陸狀態判斷是否已經登陸成功服務器

注:若是一些信息不能隨便被篡改,泄漏或者數據量較大,則不適合存放到cookie裏面cookie

問題:session

1 資源壓力,由於後端存放session通常存放到內存裏面,用戶量大的狀況,內存壓力大負載均衡

2 系統伸縮性,若是服務作負載均衡,多個服務器之間如何保證session一致性。(通常作法是把session存放到統一集羣上去)框架

3 CORS,跨域資源訪問問題fetch

4 CSRF,存放到cookie存在這個問題,須要額外解決

 

方法3: jwt

流程上是這樣的:

用戶使用用戶名密碼來請求服務器
服務器進行驗證用戶的信息
服務器經過驗證發送給用戶一個token
客戶端存儲token,並在每次請求時附送上這個token值
服務端驗證token值,並返回數據

這個token必需要在每次請求時傳遞給服務端,它應該保存在請求頭裏(也能夠存放到cookie裏面,這樣存放須要解決CSRF問題), 另外,服務端要支持CORS(跨來源資源共享)策略,通常咱們在服務端這麼作就能夠了Access-Control-Allow-Origin: *

JWT長什麼樣?JWT是由三段信息構成的,將這三段信息文本用.連接一塊兒就構成了Jwt字符串。就像樣: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

JWT的構成, 第一部分咱們稱它爲頭部(header),第二部分咱們稱其爲載荷(payload, 相似於飛機上承載的物品),第三部分是簽證(signature).

如何應用,通常是在請求頭裏加入Authorization,並加上Bearer標註:

fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})

安全相關

  1. 不該該在jwt的payload部分存放敏感信息,由於該部分是客戶端可解密的部分。
  2. 保護好secret私鑰,該私鑰很是重要。
  3. token泄漏,意味着身份能夠被僞造,jwt不解決傳輸泄漏問題,若是能夠,請使用https協議或者其它加密方式通信
  4. 保證token的時效性,確保一段時間後token失效
  5. 若是jwt存放在cookie,須要作好csrf和XSS防護
  6. Cookies,當使用帶有HttpOnly的cookie標誌時,經過JavaScript是沒法訪問的,而且對XSS是免疫的。你還能夠設置安全的cookie標誌來保證cokie僅經過HTTPS發送
  7. Replay Attacks也要作額外的工做

 注: JWT和OAuth2.0區別

JWT是一種認證協議 ,JWT提供了一種用於發佈接入令牌(Access Token),並對發佈的簽名接入令牌進行驗證的方法。 令牌自己包含了一系列聲明,應用程序能夠根據這些聲明限制用戶對資源的訪問。

OAuth2是一種受權框架 ,提供了一套詳細的受權機制(指導)。用戶或應用能夠經過公開的或私有的設置,受權第三方應用訪問特定資源。

相關文章
相關標籤/搜索