Http Only Cookie保护AccessToken
【導讀】JWT認證方式目前已被廣泛使用,一直以來我們將token放在請求頭中的Authorization中,若通過此種方式,一旦token被惡意竊取,攻擊者可肆意對用戶可訪問資源進行任意索取
我們大多都是通過登錄成功后,響應AccessToken,然后由前端將token存儲在相關Storage中,然后每次將其放請求頭而認證請求,由于token是極其敏感信息,所以我們不能將其交由前端去處理,而應由后臺獲取對前端不可見
對安全有較高要求的平臺,我們通過Http Only Cookie來解決token惡意竊取問題
Http Only Cookie
Http Only Cookie簡言之則是將相關信息響應時存儲在Cookie中,而客戶端腳本無法訪問,每次請求時,則將自動攜帶所有信息到服務器。例如,京東存儲相關信息
接下來我們看看在.NET Core中如何將AccessToken以Http Only方式存儲在Cookie中
如上,我們模擬登錄成功,并不返回AccessToken,而是將其寫入到響應頭中,上述Cookie選項HttpOnly為true即表示客戶端腳本不可訪問
此時我們來訪問如下需認證接口
[HttpGet("api/test/say")] public?string?Say() {return?"Hello?World"; }用過JWT的童鞋都知道,標準模式則是將AccessToken寫入到Authorization中,即請求頭【Authorization: Bearer ......】,那么上述是如何認證成功而請求到接口的呢?
當我們添加JWT認證時,每次請求在其對應事件OnMessageReceived中將自動獲取請求頭Authorization中的值,將其賦值給context.Token
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options?=> {......options.Events?=?new?JwtBearerEvents{OnMessageReceived?=?context?=>{//Bearer?Tokencontext.Token?=?"";??return?Task.CompletedTask;}}; });你問我是怎么知道的,我是猜的嗎,當然不是,丟出官方源碼就知道了,直接找到JWT如何處理認證則一目了然
到這里我們知道了自動獲取Token的原理,我們修改了Token存儲方式,照葫蘆畫瓢就好,如此將覆蓋默認標準模式,如下:
從分析自動獲取Token原理,我們也可知道,若與第三方對接,依然可以使用請求頭Authorization標準模式認證,因為Cookie為空,再次獲取Authorization值
注意:發現若將前端未置于wwwroot下,即完全前后分離,涉及到跨域的情況下,比如使用的是axios封裝請求,那么應該必須在請求頭中添加【withCredentials:true 】,否則使用Http Only將無效,出現401
額外意外發現一個很有意思的問題,未深入研究,這里當做小知識了解下就好,或許是我自以為發現新大陸了呢
當我們創建AccessToken時,都會設置一個過期時間,我們知道此過期時間肯定不會設置過長,但是若在比如移動端微信小程序中,若設置時間不長,必然要考慮刷新Token問題,為了懶一點,我們將Token設置為永不過期,那么JWT支持嗎?
當然支持,只不過根據我剛好嘗試了幾次,找到了JWT永不過期的上限,最大只能是16年,若超過此臨界點,比如17年,如下:
將會出現401,具體錯誤如下:
了解,了解就好,也沒啥鳥用,我也是經常會瞎想,比如考慮某些可能存在的極限情況
總結
以上是生活随笔為你收集整理的Http Only Cookie保护AccessToken的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我被Dapr点燃
- 下一篇: 记一次 .NET 某电商定向爬虫 内存碎