# [Cookie sessionWeb Storage比較] ###### tags:`Cookie session WebStorage` [[教學] Cookie 是什麼:如何使用 JavaScript 操作 document.cookie](https://www.shubo.io/cookies/) ### 網頁的資料都存在哪裡?為什麼換台電腦購物車就清空了? 換了一台電腦購物車裡的資料就清空了,代表是存在a電腦的瀏覽器裡面,而不是存在後端 | | Cookie | local storage |session storage | | -------- | -------- | -------- |-------- | | capacity容量 | 4kb | 10mb |5mb | | browsers瀏覽器 | html4/html5 | html5 |html5 | | acceaaible from接受? | any window | any window |same tab | | expires過期? | manually set手動設置 | never |on tab close | | storage location存儲位置 | browser and server | browser only |browser only | | sent with requests請求發送? | yes | no |no | ### Cookie 一段由Server送給使用者瀏覽器的一小塊資料(文檔)。 ==瀏覽器會將使用者資訊儲存下來==,並在下次發送要求的時候將它送回原來的伺服器。 * 非持久Cookie主要是儲存在記憶體 持久Cookie主要是儲存在硬碟 * 儲存空間很小,最多僅能儲存 ==4 KB== 的資料, * 加重網路流量負擔:儲存於 cookie 中的資料會在用戶端瀏覽器與伺服器之間旅行(每次瀏覽器送出 request 至伺服器時就會夾帶 cookies) * 所有數據在Client端就可以被修改,數據非常容易被偽造 * 加重網路流量負擔:cookie中數據字段太多會影響傳輸效率 * Cookie提供了狀態保存的功能以==彌補HTTP這個無狀態記錄的通訊協定== ### 最古老的方式:Cookie Cookie是==瀏覽器可以儲存資訊的地方==,就是個小型文字檔( 限制 4k ) [理解 Session 和 Cookie](https://www.youtube.com/watch?v=lNQAl71Abqc) 當瀏覽器發送 Reqeust 時,會自動帶到 Server 端。而==Server 的 response header 會有一個欄位 Set-Cookie 裡面放著資料==,只要瀏覽器看到這個資料,就會把 Cookie 寫進來。 我們可以用在 client 端用 JavaScript 把資料寫到 cookie 中,當送出 request 時會自動把 cookie 帶到 server 端,而 server 端也可以把資料寫到 response 的 header 中 set-cookie ,傳到 client 端 不同的 doman 會有不同的 cookie,一個 doman 只能儲存 20 個 cookie Cookie 的功用:辨識身份廣告追蹤身份驗證(通行證)購物車 ==打開開發者工具 Application cookie 就可以看到這個 domain 儲存的 cookie== Cookie 實務上最常見的作法 由於限制容量小並且大量的資料透過 Cookie 傳輸,==會影響效能==,因此==常見的做法是在 cookie 只存放「能代表使用者是誰的 ID」==,類似通行證一樣,而 Server 端則是儲存此 ID 的資料,當從 client 端發出 request 時,server 端就會回傳這個 ID 相對應的資料,就能辨認身份。 Server 可以在 HTTP response 中回傳 Set-Cookie header 來告訴瀏覽器要設定 cookie。 ``` Set-Cookie: [cookie名稱]=[cookie值] ``` ### session 每个用户第一次访问服务器后,会自动获得一个Session ID。 如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也认为这是一个新用户,会分配新的Session ID。 Session 會在一個用戶完成身分認證後,存下所需的用戶資料,接著產生一組對應的 ID,存入 cookie 後傳回用戶端。 Session泛指有始有終的系列動作/消息,好比會話一般。在登出之前都可以存取資料 * 儲存在伺服器 * Cookie是一張領餐的號碼牌,而Session是一張數位會員卡,紀錄你的餐點細節,消費記錄和點餐喜好,解決Cookie遺失的問題。 * 安全性高 ### Web Storage有兩種型態的儲存體:localStorage和sessionStorage * 儲存在==client端==的磁碟上。 * 一般應該至少有 ==5MB的空間== 。 * 不會在用戶端瀏覽器與伺服器之間旅行(純粹運作於用戶端)。這表示 Web Storage ==不會占用網路頻寬==。 ### 最推薦的儲存方式:local storage 打開開發者工具application>local storage local storage==新開一個分頁還是會有==可以存一些長期的資訊 只能存字串 ```htmlmixed= <body> <div class="app"><input class="text" /><button>儲存</button></div> <script> const oldValue = window.localStorage.getItem("text");//拿值顯示 document.querySelector(".text").value = oldValue; //顯示上次輸入的值 document.querySelector("button").addEventListener("click", function () { const value = document.querySelector(".text").value; //alert(value); window.localStorage.setItem("text", value);//存進localStorage }); //取得輸入值 </script> </body> ``` ### 一閃即逝:session storage 打開開發者工具application>session storage session storage==新開一個分頁就不見了==存一些短暫資訊 只能存字串==分頁關掉值就沒有了== ```htmlmixed= <body> <div class="app"><input class="text" /><button>儲存</button></div> <script> const oldValue = window.sessionstorage.getItem("text"); document.querySelector(".text").value = oldValue; //顯示上次輸入的值 document.querySelector("button").addEventListener("click", function () { const value = document.querySelector(".text").value; window.localStorage.setItem("text", value); }); //取得輸入值 </script> </body> ``` ### token 登入 產生一個 token => reponse 回給前端 - 前端需要自己儲存這個 token --> localstorage, session storage - 每一次前端發送需要身份驗正的 request 時,都必須自己帶著這個 token - 因為 cookie "預設"是無法跨網域讀取的 如果只存在 client 端,那登出會不好做 「後端絕對不可以相信來自前端的東西」
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up