[英]A secure single site JWT implementation
我閱讀了很多關於 JWT 的文章,發現很難以安全的 CSRF 和 XSS 證明方式使用它們。
直到我意識到我的令牌可能不會離開我的唯一域......這讓我想到了這個實現想法:
我不知道 JWT 的這種實現是否安全,或者我是否遺漏了什么......
這就是我要問的問題(JWT 和 web 安全專家)這會是一個好的 JWT 實現嗎?
首先,談談 JWT。 在大多數情況下,一個老式的普通服務器端 session(具有一個長的隨機 session id,正確存儲在安全的 httpOnly 中,也可能是 SameSite cookie)在大多數情況下比任何 Z1D1FADBD9140349C13578“更安全”。 原因是 JWT 將 state 存儲在客戶端上,攻擊者更容易使用它,可以針對所涉及的密碼術執行離線攻擊,JWT 也是純文本,只有它們的完整性受到保護(即它們受到保護側面更改,但默認情況下不反對查看內容,盡管您可以使用 JWE,也可以使用加密的 JWT)。 最后但並非最不重要的一點是,實現更復雜,簡單性對安全性很有幫助。
因此,當您需要它提供的好處時,您會使用 JWT。
一種說法是它是無國籍的。 不過,這經常被高估。 首先,在大多數應用程序中,瓶頸不是在數據庫中查找 session 數據所需的數據庫查找。 在一些非常高調、高流量的應用程序中,它實際上可能是這樣的,但您可能不會每天都在開發類似的東西。 通常進行數據庫查找就可以了,它使整個事情變得簡單得多。 其次,有時您需要撤銷令牌,即。 您希望能夠強制注銷用戶。 即使您使用 JWT 來實現無狀態,您也必須在數據庫中存儲一些內容,例如已撤銷令牌的列表,並且檢查這也將是數據庫往返。 撤銷 JWT 根本無法以純粹的無狀態方式實現。
另一個好處是您可以將它用於多個來源。 如果你得到一個 httpOnly session cookie,它將由瀏覽器管理,javascript 不能將它發送到其他來源,比如 API 或其他東西 - 這不是整個訪問點。 但有時您確實需要這樣做,尤其是在單點登錄場景中,您有一個身份提供者(一個提供登錄的組件)和您想要在其上使用訪問令牌的服務(例如 API)。 在這種情況下,經典 cookie 將不起作用,而 JWT 非常方便。
因此,簡而言之,當您確實需要無狀態或將令牌發送到多個來源的選項時,您將使用 JWT。 根據經驗,如果您可以將 JWT 存儲在 httpOnly cookie 中,您很可能根本不需要它,並且可以只使用普通的舊服務器端 session。
然后假設您決定使用 JWT,那么刷新令牌呢? 它們是基於令牌的身份驗證的另一個通常被誤解的功能。 使用刷新令牌的目的是能夠使用短期訪問令牌,因此如果訪問令牌被泄露,它至少是有時間限制的。 但是,如果您以與訪問令牌相同的方式存儲刷新令牌,為什么攻擊者也不能得到它呢?
如果你以不同的方式存儲它,那么只有擁有一個刷新令牌才有意義,否則你可能只有長期存在的訪問令牌,這不會降低安全性。
一個典型的事情是有一個身份提供者(“登錄服務器”或 IdP)在身份提供者來源的 httpOnly cookie 中設置一個刷新令牌(或只是一個普通的舊 session id),所以每當客戶端向IdP,如果他們已經登錄,它“就可以工作”,並且可以在沒有用戶交互的情況下提供新的訪問令牌。 然后,訪問令牌存儲在類似 localStorage(用於服務源)中,易受 XSS 影響,但至少有時間限制。 如果您沒有這種分離,那么單獨的刷新令牌可能沒有多大意義。
最后一點,所有這些都應該很少由你自己來實現。 您使用的任何語言或框架都可能已經具有一個或多個已知的良好、維護的身份驗證實現。 您應該只使用它們,但是當然仍然非常值得理解它。
請注意,在任何實際應用中,可能存在細微之處和某些情況會在一定程度上改變您想要做的事情,但以上是考慮安全身份驗證的一般方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.