後端服務器有兩種基本的身份驗證:
1.是基於Cookie的身份驗證,使用服務器端的cookie來對每次請求的用戶進行身份驗證。
2. 較新的方法,基於令牌Token的認證,依賴於被髮送到服務器上每一個請求的簽署令牌。javascript
token的優點java
1.跨域 / CORS: cookies並不能跨不一樣的域名:abc.com和xy.abc.com的cookies是不能共享的,索性這種一級二級域名是能夠經過
數據庫
設置Cookie的SetDomain參數(例如:cookies.setDomain(".abc.com"))來共享cookies.可是abc.com和xy.com是不能相互獲取 cookies的.而基於令牌可以使用 AJAX 調用服務器,在任何域名下你均可以使用HTTP header頭部來傳輸用戶信息。
2. 無態(表明服務器端可伸縮): 沒有必要將會話保存,令牌 token 本身是一個自我包容的實體,包含用戶各類信息,其餘狀態信息能夠保存在cookie或客戶端本地存儲器中
3.CDN: 可以適用來自CDN任何應用部件(e.g. javascript, HTML, images, etc.), 你的服務器只是一個 API.
4.解耦: 你沒必要和一個特定的驗證格式Schema綁定,令牌token 能在任何地方產生,這樣的你的API能夠在任何地方以同一種驗證方式調用驗證。
5.對移動Mobile友善: 當你在一個原平生臺(iOS, Android, Windows 8, etc.)時, cookies依賴於一個安全API,並非好主意,由於你得和一個cookie容器打交道,而基於令牌則簡單多。
6.CSRF: 由於你不依賴cookies, 你就不須要跨請求保護,(e.g. it 有可能來自 <iframe> 請求一個POST,須要重用一個存在的驗證。).
6.性能:一個網絡往返(如發如今數據庫中的會話)可能會比計算的HMACSHA256驗證令牌耗費更多時間。
7.登陸頁面不是一個特殊狀況,若是你若是您正在使用量角器來寫你的功能測試,你不須要來處理登陸的任何特殊狀況。
8.基於標準: 你的API能接受一個標準的 JSON Web Token (JWT). 這個標準後面有多個庫包(.NET, Ruby, Java, Python, PHP),許多公司支持(e.g. Firebase, Google, Microsoft). ,好比Firebase容許他們的客戶使用任何身份驗證機制,只要你使用預先定義的屬性生成一個 JWT,並使用共享密鑰簽署,就能調用它們的API.後端
基於Token的驗證原理跨域
基於Token的身份驗證是無狀態的,咱們不將用戶信息存在服務器或Session中。安全
這種概念解決了在服務端存儲信息時的許多問題服務器
NoSession意味着你的程序能夠根據須要去增減機器,而不用去擔憂用戶是否登陸。cookie
基於Token的身份驗證的過程以下:網絡
1.用戶經過用戶名和密碼發送請求。性能
2.程序驗證。
3.程序返回一個簽名的token 給客戶端。
4.客戶端儲存token,而且每次用於每次發送請求。
5.服務端驗證token並返回數據。
每一次請求都須要token。token應該在HTTP的頭部發送從而保證了Http請求無狀態。咱們一樣經過設置服務器屬性Access-Control-Allow-Origin:* ,讓服務器能接受到來自全部域的請求。須要主要的是,在ACAO頭部標明(designating)*時,不得帶有像HTTP認證,客戶端SSL證書和cookies的證書。