一、為什么需要登錄憑證呢?
1、web開發中,我們使用最多的協議是http,但是http是一個無狀態的協議,
2、無狀態的協議?什么叫做無狀態協議呢?
舉個例子:
(1)我們登錄了一個網站 www.xxx.com,登錄的時候我們需要輸入用戶名和密碼:比如用戶名root,密碼:123456.;
(2)登錄成功之后,我們要以root的身份去訪問其他的資料和資源,還是通過http請求去訪問,
xxx的服務器會問:你誰呀?
root說:我是root呀,剛剛登錄過呀;
xxx:怎么證明你剛剛登錄過呀?
root說:這,,,,http沒有告訴你嗎?
xxx:http的每次請求對我來說都是一個單獨的請求,和之前請求過什么沒有關系,
(3)看到了吧?這就是http的無狀態,也就是服務器不知道你上一步做了什么,我們必須得有一個辦法可以證明我們登錄過,
二、cookie
1、認識cookie
(1)Cookie(復數形態Cookies),又稱為“小甜餅”,型別為“小型文本檔案,某些網站為了辨別用戶身份而存盤
在用戶本地終端(Client Side)上的資料,
- 瀏覽器會在特定的情況下攜帶上cookie來發送請求,我們可以通過cookie來獲取一些資訊;
(2) Cookie總是保存在客戶端中,按在客戶端中的存盤位置,Cookie可以分為記憶體Cookie和硬碟Cookie,
- 記憶體Cookie由瀏覽器維護,保存在記憶體中,瀏覽器關閉時Cookie就會消失,其存在時間是短暫的;
- 硬碟Cookie保存在硬碟中,有一個過期時間,用戶手動清理或者過期時間到時,才會被清理;
(3)如果判斷一個cookie是記憶體cookie還是硬碟cookie呢?
- 沒有設定過期時間,默認情況下cookie是記憶體cookie,在關閉瀏覽器時會自動洗掉;
- 有設定過期時間,并且過期時間不為0或者負數的cookie,是硬碟cookie,需要手動或者到期時,才會洗掉;
2、cookie常見的屬性
(1)cookie的生命周期:
- 默認情況下的cookie是記憶體cookie,也稱之為會話cookie,也就是在瀏覽器關閉時會自動被洗掉;
- 我們可以通過設定expires或者max-age來設定過期的時間;
- expires:設定的是Date.toUTCString(),設定格式是;expires=date-in-GMTString-format;
- max-age:設定過期的秒鐘,;max-age=max-age-in-seconds (例如一年為606024*365);
(2)cookie的作用域:(允許cookie發送給哪些URL)
- Domain:指定哪些主機可以接受cookie
如果不指定,那么默認是 origin,不包括子域名,
如果指定Domain,則包含子域名,例如,如果設定 Domain=mozilla.org,則 Cookie 也包含在子域名中(如developer.mozilla.org), - Path:指定主機下哪些路徑可以接受cookie
例如,設定 Path=/docs,則以下地址都會匹配:
/docs
/docs/Web/
/docs/Web/HTTP
3、客戶端設定cookie
-
js直接設定和獲取cookie:

-
這個cookie會在會話關閉時被洗掉掉;

-
設定cookie,同時設定過期時間(默認單位是秒鐘)

4、服務器設定cookie
(1)Koa中默認支持直接操作cookie
- /test請求中設定cookie
- /demo請求中獲取cookie

三、session
1、Session是基于cookie實作機制
- 在koa中,我們可以借助于 koa-session 來實作session認證:



三、token
1、認識token
(1)cookie和session的方式有很多的缺點:
- Cookie會被附加在每個HTTP請求中,所以無形中增加了流量(事實上某些請求是不需要的);
- Cookie是明文傳遞的,所以存在安全性的問題;
- Cookie的大小限制是4KB,對于復雜的需求來說是不夠的;
- 對于瀏覽器外的其他客戶端(比如iOS、Android),必須手動的設定cookie和session;
- 對于分布式系統和服務器集群中如何可以保證其他系統也可以正確的決議session?
(2)所以,在目前的前后端分離的開發程序中,使用token來進行身份驗證的是最多的情況:
- token可以翻譯為令牌;
- 也就是在驗證了用戶賬號和密碼正確的情況,給用戶頒發一個令牌;
- 這個令牌作為后續用戶訪問一些介面或者資源的憑證;
- 我們可以根據這個憑證來判斷用戶是否有權限來訪問;
(3)所以token的使用應該分成兩個重要的步驟:
- 生成token:登錄的時候,頒發token;
- 驗證token:訪問某些資源或者介面時,驗證token;
2、JWT實作Token機制
JWT生成的Token由三部分組成:
(1) header
-
alg:采用的加密演算法,默認是 HMAC SHA256(HS256),采用同一個密鑰進行
加密和解密; -
typ:JWT,固定值,通常都寫成JWT即可;
-
會通過base64Url演算法進行編碼;
(2) payload
- 攜帶的資料,比如我們可以將用戶的id和name放到payload中;
- 默認也會攜帶iat(issued at),令牌的簽發時間;
- 我們也可以設定過期時間:exp(expiration time);
- 會通過base64Url演算法進行編碼
(3) signature
- 設定一個secretKey,通過將前兩個的結果合并后進行HMACSHA256的演算法;
- HMACSHA256(base64Url(header)+.+base64Url(payload), secretKey);
- 但是如果secretKey暴露是一件非常危險的事情,因為之后就可以模擬頒發token,
也可以解密token;

3、Token的使用
當然,在真實開發中,我們可以直接使用一個庫來完成: jsonwebtoken;

4、非對稱加密
(1)前面我們說過,HS256加密演算法一單密鑰暴露就是非常危險的事情:
- 比如在分布式系統中,每一個子系統都需要獲取到密鑰;
- 那么拿到這個密鑰后這個子系統既可以發布另外,也可以驗證令牌;
- 但是對于一些資源服務器來說,它們只需要有驗證令牌的能力就可以了;
(2)這個時候我們可以使用非對稱加密,RS256:
- 私鑰(private key):用于發布令牌;
- 公鑰(public key):用于驗證令牌;
(3)我們可以使用openssl來生成一對私鑰和公鑰:
- Mac直接使用terminal終端即可;
- Windows默認的cmd終端是不能直接使用的,建議直接使用git bash終端;
openssl
> genrsa -out private.key 1024
> rsa -in private.key -pubout -out public.key
5、使用公鑰和私鑰簽發和驗證簽名

6、派發令牌和驗證令牌


轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/265678.html
標籤:區塊鏈
上一篇:分布式 | 拜占庭將軍問題
下一篇:Markdown
