昨天剛講完 Cookie 原理,趁大家記憶猶新趕快來觀察一下 Github 的登入機制還有他是如何傳遞 cookie 的,我覺得觀察這個還滿有趣的,大家也可以跟著做做看,話不多說,馬上開始第一步吧
用無痕模式剛到登入頁面時馬上就被 Set 很多個 Cookie,其中最重要的兩個分別是 logged_in=no
跟 _gh_sess=...
,我想 _gh_sess
應該是 Github session 的意思,用來記錄目前這個使用者的 session,而 logged_in=no
很明顯就是記錄目前這個 session 目前有沒有登入
我想知道剛剛那個 cookie _gh_sess=...
對於登入是不是很重要,所以我把它刪掉,再試試看能不能登入
刪掉 _gh_sess
之後我輸入正確的帳號密碼按下登入,結果果然失敗了,而且 Github 回傳 422 Unprocessable Entity
,代表這個 _gh_sess
很重要,只有帳號密碼沒有 Github Session 是沒辦法登入的
你可以想說哪有這麼幸運,一次就可以找到
_gh_sess
是關鍵 cookie?其實我試了很多次才找到,就一個一個慢慢刪掉看看,多試幾次總會成功的XD
這次試試看不要把 _gh_sess
刪掉就登入,看著 _gh_sess
跟著請求傳出去然後就成功了,所以可以確定一定要有 _gh_sess
才能登入
登入後瀏覽器得到三個新的 cookie,分別是 user_session
、__Host-user_session_same_site
跟 dotcom_user
這邊有一個很奇怪的地方是 user_session
跟 __Host-user_session_same_site
兩個 cookie 的值竟然是一樣的,個人猜測應該是用來驗證的,如果請求中的這兩個 cookie 值不一樣就拒絕請求
因為我想知道 Github 到底是判斷哪個 cookie 知道我有沒有登入,於是我把 user_session
刪掉再重新整理,結果果然又回到了登入前的頁面,代表 user_session
存的東西應該是登入後的 session Id,沒有他就會被登出
由上面五個步驟的觀察猜一下 Github 的登入流程:
_gh_sess
裡面user_session
裡面user_session
這張號碼牌,這樣 Github 就能辨識你是誰這篇觀察篇是想跟大家分享我是怎麼觀察 Github 的登入機制以及怎麼找到關鍵 cookie,雖然看我做起來好像很簡單,但其實中間要一直反覆測試才能找到關鍵,所以也是花了非常多時間XD
俗話說「知己知彼,百戰百勝」,我們現在已經了解 Github 的登入機制了,要模仿他還會難嗎?
明天就要正式實作登入了,如果對這篇有什麼疑問可以在底下留言,我會盡力回答大家,大家如果有空的話也可以試著去觀察 Facebook、Gitlab 等等網站的登入機制,說不定會有意想不到的收穫哦
__Host-user_session_same_site
設定了 SameSite=Strict
,在跨域請求時 cookie 不會被加上去,主要用來作 CSRF 防禦,詳情可以參考這篇 https://blog.techbridge.cc/2017/02/25/csrf-introduction/
原來是這樣,謝謝你的補充~