關於令牌過期這件事...

以前有次在寫 JWT 的時候,有一個欄位叫做 exp (Expiration time),表示這個令牌(token)的過期時間,筆者記得當時最簡單可以使用的 C# 套件,預設是無法移除這個欄位,但是需求就是 token 寫入對方系統後,不要需要也不能更改,所以 token 不能過期。

有人就說,那不然過期時間就設定為西元 9999 年 12 月 31 日不就好了?

身為一位龜毛的軟體工程師,當然希望能夠做到最好,馬上否決了這個提案,畢竟筆者也是有聽過「千禧蟲危機」的,千禧蟲簡單來說就是當時 196X 年電腦剛開發時,為了節省儲存裝置成本,將電腦的日期簡化成6位數,將西元前面的19去掉,只使用各兩碼的年、月、日來儲存日期,但問題就是到 2000 年時,電腦可能會誤判為是 1900 年,進而引發各式各樣的錯誤。

筆者記得後來是使用 jose-jwt 這個套件來達成,JWT 能夠不放入 exp 欄位,很好的解決了這個問題。其實這件事只是工程師開發日常的一個小插曲,有最簡單的解決方式(過期時間設為西元 9999 年),也有最好的方式(直接不放入過期時間欄位),但假設今天這個專案因為各種原因不能再加入其他套件時,我是否還是會想盡辦法移除過期時間欄位呢?

後來我在 Github 上面看到這一個有趣的回答
兄弟,我來自未來,你的令牌剛剛過期,世界大亂

上面有人留言說到,這個時間很長,但不是合理的解決方式,或許 9999 年你的應用程式執行在其他星系,又或是發生我們無法想像的情況。

這個有趣的留言讓我了解到,以後我在找到任何權變措施要執行前,一定要換個角度思考,或許自己的小聰明,有可能會在日後造成比解決的問題還更大的災難。

留言