api可以主动采集用户数据吗_现在的前端框架全是通过API获得数据,如何记录用户登录状态?...
很多答案都提到了 JWT、Session、Cookie,但是我發現常常有人混淆這三個概念。或者說不同的語境下大家對 Session 會有不同的理解。
首先這三個名詞表示的是三個緯度的東西,不能簡單地說這個方案可以替代那個方案,更不能直接拿來做比較
Session 表示客戶端和服務端之間的會話,因為 HTTP 請求是無狀態的,所以為了把一個 HTTP 請求跟其他 HTTP 請求關聯起來讓服務端知道當前在跟它對話的客戶端是誰,我們就需要有一種機制來保存這些請求之間的用戶數據,這就是會話。所以題主所問的“如何記錄用戶登錄狀態”其實就是“如何保持一個會話“。
Session 機制的實現一般有兩種,最常見的就是服務端給客戶端發一個 id,然后在服務端存上這個 id 所對應的數據,如果用戶有登錄,就把用戶的 id 存到對應的數據里。另外一種就是把會話的數據加密簽名后發給客戶端,這樣服務端就不需要再去存數據,典型的例子就是 Rails 的默認 Session 實現。這里的 id 和加密數據的傳輸和存儲一般情況下會用 Cookie 來實現。
另外,有人說 “session” 這個詞的時候,也可能指他所用的 web 框架對 Session 機制的實現,或者指跟 Session 所關聯的數據。但是在這里,我們所說的 Session 都是指 Session 機制。
Cookie 是什么就不說了。
JWT 是一種 token 的生成標準,具體這個標準是什么樣,用 JWT 的好處,這里不展開,可以看官網文檔。通常情況下,我們用 JWT 就是為了實現上面講的第二種 Session 機制,把會話數據(通常就是 user id)存在客戶端。
搞清楚了這三者的概念,我們再來看下怎么樣才是使用 JWT 的正確姿勢。
有人推薦把 JWT 存在 Local Storage/Session Storage 里,其實這是有風險的,當你的應用有 XSS 漏洞時,攻擊者很容易就能拿到用戶的 token,然后為所欲為。所以,不推薦把 JWT 存在 Local Storage 等任何可以被 JS 直接讀取到的地方。
推薦把 JWT 放在 Cookie 里,并且設置 httpOnly 屬性。不過,放在 Cookie 里會面臨另外一個 CSRF 攻擊的風險,你可以通過設置一個 csrf token 來防止此類攻擊,現代 web 框架都會自帶這個功能,比如:Securing Rails Applications?guides.rubyonrails.org
安全 - 為企業級框架和應用而生?eggjs.org
要注意的是, Cookie 的值會有 4KB 大小的限制,所以不要在 JWT 里塞太多東西。
最后總結成一句話回答題主的問題:我們可以通過把 JWT 保存在 Cookie 里來保持 Session。
所以你看,如何保持 Session 其實跟你的應用有沒有用前端框架,是不是 SPA,關系不大。
注:以上方案只針對 web 應用。
總結
以上是生活随笔為你收集整理的api可以主动采集用户数据吗_现在的前端框架全是通过API获得数据,如何记录用户登录状态?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钢铁概念股龙头 感兴趣的不要错过了
- 下一篇: 为什么etc没有扣款记录