cookies
當server想要儲存使用者的某些狀態時,就可以發送cookie給client,cookie是http header裡面其中一個欄位,cookie裡的資料以key/value的形式儲存,cookies通常儲存在client的瀏覽器中,也因此若當cookie並沒有加密時,在傳送的過程中容易被攔截或盜取,故並不鼓勵以cookie儲存一些敏感的資料,除了加密之外,更要設定時間在不需要cookie的時候將它刪除。 每個cookies的檔案最大只能到4k,在使用者瀏覽網站的時候瀏覽器會將cookie儲存在記憶體中,當瀏覽器關閉時,尚未expire的cookies會被存進文字檔中,並等待下次連線使用。
Session
相對於cookies處存在client端,session則是儲存在server端,session也需要cookie的輔助才能產生運作,因為server會傳送存有session id的cookie給client,並在server端建立起這個session id的檔案,在之後client在瀏覽網頁時都會夾帶此session id,如此一來server即可從此session id來辨認每個使用者所儲存的狀態與data。相對於cookies,session多用來儲存敏感的資料,也常常成為攻擊的目標,如session hijacking。
遇到的問題
在處理Auth Serveer遇到的問題。
以google的Oauth2來說,
對於Auth Server來說,基本上就是只有一個session
首先,是使用者點下auth with google的按鈕開始,這個是第一條session
接著google會把使用者導到他們的認證網頁,進行認證後,google會重導使用者到當初註冊時指定的redirect url上,
這個redirect,express還是會判定為剛剛那第一個session
所以,可以在一開始讓使用者帶入資訊以利oauth判斷使用
首先,一開始:
window.location = "https://pillapet.com:3000/auth/google?mac=12345678&name=pilla"; 在Google的redirect url則是https://pillapet.com:3000/auth/google/callback
在使用者被redirect的連結就可以使用剛剛的儲存資料
session的定義應該是儲存在cookie裡面的session ID,
做實驗發現,沒有清除cookie的話,同一個電腦的browser開啟server會對到同一個session
但是只要把cookie清除session資料就不見了
(花了我一天多的時間在釐清問題... 肯)
撞牆的原因
一開始,我使用的是
window.location = "https://192.168.100.9:3000/auth/google?mac=12345678&name=pilla"; Google的redirect url則是https://pillapet.com:3000/auth/google/callback
即使windows的dns設定pillapet.com是192.168.100.9,看起來express會認定這是兩個sessions
可能是browser儲存cookie的機制跟url name有關
最後,引句express-session的定義
Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.
參考資料
http://andikan.github.io/blog/2012/10/03/cookie-and-session/ https://stormpath.com/blog/everything-you-ever-wanted-to-know-about-node-dot-js-sessions/ http://blog.modulus.io/nodejs-and-express-sessions https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive
留言列表