簡體   English   中英

一個安全的單站點 JWT 實現

[英]A secure single site JWT implementation

我閱讀了很多關於 JWT 的文章,發現很難以安全的 CSRF 和 XSS 證明方式使用它們。
直到我意識到我的令牌可能不會離開我的唯一域......這讓我想到了這個實現想法:

  1. 使用刷新令牌和訪問令牌。 這樣,我可以為訪問令牌設置較短的過期時間,並限制數據庫調用以驗證用戶,並且僅在訪問令牌過期時通過詢問數據庫在發送新訪問令牌之前刷新令牌未被列入黑名單進行簡單驗證用戶。
  2. 我知道如果我將令牌存儲在本地/會話存儲中,它將容易受到 XSS 攻擊,但如果我將其存儲在僅 HTTP 的 cookie 中,它將容易受到 CSRF 攻擊。
  3. 由於我不需要訪問 JavaScript 中的令牌,並且我只需要在一個網站中使用這個令牌,我認為我可以將訪問令牌存儲在一個僅限 HTTP 的 cookie 中(這樣就可以保護它免受 XSS 攻擊)以及安全標志和同一站點標志設置為嚴格(防止 CSRF)。
  4. 關於刷新令牌,我可以將它存儲在具有相同安全標志但這次沒有相同站點標志的僅 HTTP cookie 中。 因為服務器永遠不會僅基於刷新令牌執行任何操作,我認為它因此不會受到 CSRF 攻擊。 服務器對刷新令牌唯一要做的就是發回一個新的訪問令牌,如果我理解得很好,CSRF 攻擊者無法讀取該令牌。 CSRF 漏洞允許攻擊者向服務器發出請求(服務器將自動包含僅 HTTP cookie),但他無法讀取該請求的響應。

我不知道 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM