問題: 判斷一個用戶是否已經受權登陸後端
用戶經過用戶名和密碼登陸成功以後,服務端往客戶端設置cookie islogon=1,api
問題: 客戶端能夠隨意僞造這些信息,不安全跨域
用戶經過用戶名和密碼登陸成功以後,服務端爲該用戶生成一個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存在這個問題,須要額外解決
流程上是這樣的:
用戶使用用戶名密碼來請求服務器
服務器進行驗證用戶的信息
服務器經過驗證發送給用戶一個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
}
})
安全相關
注: JWT和OAuth2.0區別
JWT是一種認證協議 ,JWT提供了一種用於發佈接入令牌(Access Token),並對發佈的簽名接入令牌進行驗證的方法。 令牌自己包含了一系列聲明,應用程序能夠根據這些聲明限制用戶對資源的訪問。
OAuth2是一種受權框架 ,提供了一套詳細的受權機制(指導)。用戶或應用能夠經過公開的或私有的設置,受權第三方應用訪問特定資源。