Session、Token、API安全設(shè)計

名詞解釋

  • session 會話,維護用戶狀態(tài)。會話中關(guān)聯(lián)了用戶信息。
  • token 令牌,用于簽權(quán)。

很多人糾結(jié)于token是什么,session又是什么,但我認為,這就是兩個單詞,兩個概念而已,就看你怎么去實現(xiàn)并使用了。

Session

session顧名思義就是會話,維護了用戶的狀態(tài)就是會話,這是為了解決http是stateless的問題發(fā)明的東西。

通常的用法是:

  1. 用戶使用賬號+密碼/手機號+驗證碼登錄
  2. 后臺驗證通過后會在Redis會話表里產(chǎn)生一條記錄,這條記錄就可以稱為會話!記錄里面有一個隨機的唯一值和用戶的信息,這個隨機的唯一值會返回給客戶端保存,以后的接口通過這個唯一值進行鑒權(quán),這個唯一值可以稱為sessionId。
  3. 后臺接口帶上sessionId,服務(wù)器拿到后去表里校驗是否存在且有效,有效則鑒權(quán)通過,無效則報錯

Token

Token翻譯過來就是令牌,何為令牌,就是一個證明自己的證明。那拿剛才的sessionId來說,它又何常不是一個證明呢?它證明了我之前是登錄過的,并且是有效的用戶,所以我認為,剛才的sessionId也可以稱為token,也有人認為那就是token。

看到這里估計又有人吐槽了,token的狀態(tài)是保存在客戶端的,session是服務(wù)端在管理狀態(tài)。這么理解的人是認為,session管理需要在后臺存表,管理這個狀態(tài),而token后臺不需要保存,因為token里自帶了信息,比如用戶基本信息、過期時間等,后臺每次收到直接解密校驗即可,所以說token的狀態(tài)是保存在客戶端的。這么理解不是不可以,很多人也是這么用的,但有明確規(guī)定token就一定要帶信息嗎?別和我說JWT,JWT只是token的一種實現(xiàn)而已,不代表所有token都必須要有用戶信息。我不反對有人這么理解,因為token和session本身就是概念,并不是規(guī)定,有不同的理解就可以有不同的實現(xiàn)。

鑒權(quán)方案

剛其實已經(jīng)說到兩種實現(xiàn)了,對于客戶端來講,拿到的就是一個字符串,并不關(guān)心它叫什么,也不關(guān)心服務(wù)端怎么去校驗,只是每次請求里帶上這個字符串就好了。

服務(wù)端校驗的兩種方式:

  1. 查表校驗

    這種方式就是session的通常用法了,服務(wù)端會建表,把所有用戶的會話都存在Redis。這種方式是有好處的,可控度更高,要以隨時把一個發(fā)出去的token/sessionId置為失效,這是保障安全的一個重要手段。如何隨時失效呢?因為客戶端每次請求帶的token/sessionId都需要去Redis里查找看是否存在且有效,無效就無法訪問了,是否有效由后臺決定,失效操作可以進行邏輯刪除或物理刪除。

  2. token自校驗

    這種方式就是用戶登錄后,服務(wù)端把用戶信息和過期時間或一些其它信息進行加密處理,生成一個token返回給客戶端,客戶端下次帶token上來時,服務(wù)端不需要去查表,因為這個token是帶用戶信息的,先對token進行解密,能解密出用戶信息說明這個token是服務(wù)端簽發(fā)的,再判斷是否過期,如果沒過期就有效。

    此方案好處是不需要查表了,省去了后臺session管理的一堆邏輯。也不需要考慮會話集群同步問題。但缺陷是這種token只能等它自動失效,無法由后臺決定是否失效。當token被竊取進行惡意攻擊時并沒有很好的對策,看到這里就有人說了,定一個黑名單機制不就好了,如果定一個黑名單機制,不也一樣要查表嗎?那對比查表校驗的優(yōu)勢又在哪呢?也會有人說把token的有效期設(shè)置短點不就安全了,但設(shè)置短了讓用戶頻繁登錄這種體驗就很差了。

API安全設(shè)計

API的安全需要做好防竊取、防篡改、防重放等,安全都是相對的,要在安全和效率做權(quán)衡。所以有效且安全的方案是Https + token + url簽名。

  • https用來保證鏈路的安全,避免數(shù)據(jù)被截取
  • token是用來簽權(quán)的,看是否是合法的用戶
  • url簽名是把請求參數(shù)做一個不可逆的算法簽名,作用一是保證內(nèi)容沒有被篡改,作用二是也保證了客戶端的合法性,因為算法是和后臺約定的

有些公司會使用時間戳校驗,如果時間相差超過一定時間就認為無效,這種做法還有待商榷,因為有可能用戶的時間是手動調(diào)過的,就不能以用戶手機的時間為準了,如果用服務(wù)器時間就需要經(jīng)常請求,也不合適,那就需要一套用戶和服務(wù)器時間同步機制了,個人認為不是很必要。

總結(jié)

token自校驗這種方式更適用于開放平臺,類似微信這種,在token中加入信息去校驗調(diào)用者是否符合要求,同時權(quán)限范圍也在token中有指定。

查表校驗更適用于自家App,有token/sessionId就可以執(zhí)行此用戶的所有操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容