---
tags: Blue 的學習紀錄
---
# JWT 放在 cookie 或是 bearer token?
這個問題的緣由來自於網路上網友的提問
而我曾經也思考過這問題,但是沒有做紀錄
以下的內容是我與匿名網友的問答過程
(未來若我有想到額外事情,可能會再補充)
網友1:
> 請問巨佬們, 關於 JWT 哪時候該放 cookies 又哪時候該用 bearer token 呢
我:
> 我分享自己在不查資料下的直覺認知,有錯請幫我指正~
> cookie:
放在 cookie 的資料是由瀏覽器自動帶上的
所以前端實作上不用管理 JWT 的存放,由瀏覽器來負責
但同時可能需要防範 CSRF 攻擊的可能,所以可能需要實作 CSRF token 的機制
> header bearer token:
由前端在 request header 中手動放入 JWT
因為是手動,所以前端需要實作"放置"的邏輯
而不像 cookie 是由瀏覽器自動帶上
而且前端也需要負責和決定 JWT 的存放
例如放在 local storage?
還是單純用變數存起來,分頁關掉後就不見?等等
> 結論:
使用 cookie 表示選擇讓瀏覽器自動化做掉一些事
工程師在使用 cookie 以前應先了解瀏覽器怎麼處理 cookie
使用 bearer token 表示前端要負責 JWT 的傳送及存放
由於是工程師手動做,所以實作門檻相較於 cookie 較高一些,但也比較自由
網友2:
> 補充另一個角度來區分這兩個方法的差異:cookie 需要同網域,需要防 CSRF;bearer token 需要 local storage,需要防 XSS。
> 因此同網域的話,用 cookie 會比較好,比較多安全的參數可以調整
如 samesite、httponly、secure 等,跨網域只能(或建議)選擇用 bearer token。
網友1:
> 太棒了!
不過是不是用 cookies 就沒辦法同時兼顧到 mobile 端的部份呢 (IOS/Android 本身好像沒 cookies 機制)
網友2:
> 嗯對,除非自己寫程式模擬瀏覽器行為
## 延伸閱讀
[更好的選擇?用 JWT 取代 Session 的風險](https://blog.kenwsc.com/posts/2023/jwt-vs-session/)
# refresh token 交換 access token 這件事情的觸發時機
懶得開新篇,所以在這裡做紀錄
形式一樣和上面那篇一樣,是紀錄與網友間的互動問答
網友1:
> 請問通常 refresh token 交換 access token 這件事情的觸發時機
前端會怎麼去設定呢
因為要保證 refresh token 到期之前
一直持有有效的 access token
好奇怎麼做比較對
網友2:
> 你這個系統設計問題 去找AAA system design
這就有答案了
很common的設計
有系統瓶頸再提出來 否則你這個問題太base了
我:
> 雖然我是純後端,不熟這 part,但再來拋磚引玉看看XD
我的想法是前端收到401後
就去拿refresh token (如果有的話)更新 access token
然後 retry 一次
retry後還是401就當作沒權限去處理
網友3:
> 比較正規的做法是,每個 access token 都有自己的 expire time,通常在過一半的時間做 refresh,如果可以排程就是先排好時間做 refresh,如果不行就是在 startup 的時候判斷時間是否剩一半不到,如果是就做 refresh,實務上是兩者都會做,避免系統把排程清掉
網友4:
> 到 auth server login 後取得 AT1 跟 RT1
用 AT1 去取得資料
當 AT1 過期去取資料失敗後
拿 RT1 再去 auth server 再要一組 AT2 跟 RT2
Loop
網友5:
> access token 過期的時候再拿 refrest token 交換
網友4:
> 然後安全性部分
AT 要設定時效性,例如半小時後過期
RT 可以不用設時效性 (不會過期),但只能用一次
> 如果發現同一個RT被重複使用,就整個都斷開!
斷開鎖鏈!(X