據我瞭解JWT驗證它基本上是這樣的:當攻擊者獲得用於生成JWT的祕密時會發生什麼?
- 用戶發送的登錄憑據到服務器
- 如果登錄憑據是正確的,服務器發出包含的用戶ID和用戶名一智威湯遜(或任何你想要的在有效載荷,以確定
- 是使用應用程序範圍內的祕密,這應該被存儲在環境變量
- JWT是由用戶存儲生成此JWT用戶),例如在localStorage的和與每一個請求發送到標頭 012中的服務器
- 使用應用程序範圍的祕密驗證auth頭中的JWT。如果驗證成功,我們知道誰發送了請求,並且請求是否被授權。
但是如果攻擊者獲得訪問用於生成智威湯遜祕密的信息會發生什麼?是不是像主密碼?隨着祕密和用戶ID /用戶名,任何人都可以爲任何用戶發佈JWT,並基本上接管任何帳戶。這不是一個巨大的缺陷,因爲一小部分信息會危及整個系統(而不僅僅是一個用戶帳戶)?還是我誤會了?
此頁面指示最佳實踐:https://stormpath.com/blog/jwt-the-right-way/「保護用於計算和驗證簽名的祕密簽名密鑰。祕密簽名密鑰只能由發行人和消費者,它們不應該在這兩方之外訪問。「jwt示例代碼有一個硬編碼的密鑰,很多人都會對他們的代碼做同樣的事情,從不評估實踐,然後一部分人將這些代碼存儲在公共存儲庫中。危險,順便說一句 –
是的,當然它不應該被硬編碼,它不應該在你的回購(或在Github上爲上帝着想)......但是讓我說我有幾個應用程序的實例,通過啓動新實例因此我需要將祕密傳遞給我的應用程序的每個實例,這意味着我必須將祕密存儲在我的服務器上的某個地方,因爲我不打算手動啓動實例,輸入只存在於我的應用程序中的祕密現在我的問題是:如果有人能夠訪問這個祕密怎麼辦?整個應用程序基本上都是公開的,對吧? –
正如我剛纔想到的那樣,讓攻擊者更難以爲每個用戶添加一個隨機的,唯一的,串到存儲在用戶信息中的JWT。任何攻擊者都可以輕鬆讀取,但只能用於當前登錄的帳戶。這樣服務器就會立即知道服務器上是否生成了JWT。不利的一面是,每一個保護API端點的請求都會影響數據庫,查詢用戶表來驗證字符串。 –