2017-02-15 54 views
3

我們正在構建基於Symfony 3 REST API(使用FosRestBundle)的Angular 2 Web應用程序。我們使用有狀態的JWT在後端和前端之間驗證用戶身份。對於使用JWT的Symfony 3 API REST和Angular webapp使用CSRF令牌保護有用嗎?

我們現在正在考慮CSRF,並且我們想知道除了JWT之外是否使用CSRF令牌是正確的。我們看到,在FosRestBundle documentation

當構建既要通過HTML形式,以及通過REST API處理形式單一的應用程序,一個運行與CSRF令牌驗證的一個問題。在大多數情況下,需要爲HTML表單啓用它們,但將它們用於REST API是沒有意義的。出於這個原因,有一個表單擴展來禁用具有特定角色的用戶的CSRF驗證。這當然要求REST API用戶對自己進行身份驗證並獲得指定的特殊角色。

我們瞭解,其他一些StackOverflow的問題,太(見例如herehere)。

我的問題很簡單:爲什麼不推薦使用帶REST API的CSRF令牌?我們不瞭解JWT如何保護CSRF攻擊。

感謝:-)

回答

2

首先, 「狀態智威湯遜」 是一個矛盾。引述the introduction to JWT

每當用戶想要訪問受保護的途徑和資源,用戶代理應該發送的智威湯遜,通常使用承載架構的授權頭。標題的內容應該如下所示:

Authorization: Bearer <token>

這是一個無狀態認證機制爲用戶狀態爲永遠不會保存在服務器內存。服務器的受保護路由將在授權頭中檢查有效的JWT,如果存在,用戶將被允許訪問受保護的資源。

使用JWT進行身份驗證(如果正確執行)會使CSRF令牌過時。這是因爲CSRF攻擊依靠瀏覽器存儲您的Cookie,並將每個請求發送到服務器。但是,當點擊觸發POST請求的僞造表單中的按鈕時,該請求將永遠不會包含標頭Authorization,因此服務器將其視爲未經授權。