Cookie & Session 與HTTP 特性

CharisLai
7 min readJun 12, 2023

--

技術方法的衍生,都是為了解決問題

為什麼會有Session? 與Cookie是什麼關係?
網站中哪個功能需求會用到Cookie & Session?

論說Session就得先說到HTTP

HTTP特性

  • stateless 無狀態,不會主動儲存狀態資訊,每個request是獨立的。
  • distributed 分散式架構, 基於stateless特性,相同的請求均可取得同樣的結果。
  • collaborative協作架構
  • hypertext 超文本 not just “text” but with “links”

由於stateless Server與Client 不會保持連線狀態,故Client與Server雙方的狀態皆不會即時更新。

那有什麼問題?

不論是Client A or Client B丟出了幾次request,Server無法辨別這request源自於哪個Client A or Client B。

為此產生了一種HTTP儲存狀態的方法, cookie & session,。

cookie:伺服器會傳送一些資訊,瀏覽器要在一段期間內(可設置期限)將它儲存起來。特定的資訊是由伺服器決定的。記載用戶端憑證 (session_id)以識別特定的瀏覽器。

session:伺服器端憑證對照表的儲存機制,當收到session_id以此查詢user_id。

Passport Local Strategy的example

When a user first arrives at this app, they are prompted to sign in.
Once authenticated, a login session is established and maintained between the server and the user’s browser with a cookie.

  1. 當使用者首次使用應用程式必須給予帳號密碼進行註冊request 。
  2. server驗證確認使用者資料(user_id)並存入server database並新增相對應的cookie (server_id 、登入期限、與僅限特定網域內存取等) 資料包給user
  3. user瀏覽器自動將cookie 唯一一個的session_id存取,user每發出request中皆主動帶有cookie
  4. server驗證確認該session是登入狀態,並給予user request所需的資料。
  5. 若user登出,該server就將相應的session_id從server database中移除,終止該session。

若在資安嚴謹的網站Cookie設有短時間性的有效期限或終止時間,並只能在特定網域內被存取,和經過加密處理。

每個機制設定下難免有不敷使用的狀況,隨著需求逐步演變,由於cookie無法跨域使用,而有了Token-session based/ JWT 處理跨域驗證。

關於 Cookie

  • Cookie無法對使用者保密:用戶端可以查看所有伺服器傳送給用戶端的cookie
  • 使用者可以刪除停用cookie:使用者可以完全控制cookie,用瀏覽器刪除所以cookie,或個別刪除。而僅有最簡單的web應用程式才能在沒有cookie的情況下工作。
  • 正規的cookie可能會被竄改:當具有相關cookie的瀏覽器對伺服器發出請求,而盲目地信任那cookie的內容時,等於門戶大開,存有被攻擊的風險。為確保cookie不被竄改,可使用signed cookie,但此並非永無隱憂。
  • cookie可用來進行攻擊:跨站指令碼攻擊(XSS),其中一種技術會用JavaScript惡意修改cookie內容。signed cookie可協助辨識,然而有一種設定可指定cookie只能被伺服器作修改。
  • 使用者會知道濫用cookie:若在使用者端設定許多cookie,或儲存許多資料,會因此讓使用者使用感受不佳,有時應避免這情形。請試著減少cookie的使用程度。
  • 請多利用session而非cookie:使用session來保存狀態,不用擔心浪費使用者的儲存空間,而且也比較安全。

外部認證

要讓cookie具備安全性,為cookie加密會是必要的動作。
cookie保密是一個伺服器知道的字串,當cookie被傳送到用戶端時,會被用來對它們加密。
它(字串)不是需要記得的密碼,能用隨機字串。
使用第三方認證機制是常見的做法,如cookie加密、資料庫密件。
此字串(憑證)會放置於外部JavaScript檔案,且會在.gitignore中記錄以避免被存儲。

Express的Cookie
請查閱cookie-parser

學習好夥伴ChatGPT怎麼說?

Q: Cookie有哪些資訊?
AI:
Cookie是一種用於在瀏覽器和網頁伺服器之間傳遞的小型文本文件,用於存儲特定網站的使用者資訊。一個Cookie通常包含以下資訊:

1. 名稱:Cookie的名稱,用於識別特定的Cookie。

2. 值:Cookie所包含的數據,這些數據可以是文本、數字、日期等。

3. 域名:Cookie所屬的網域名稱,指定了哪些網域可以訪問這個Cookie。

4. 路徑:指定了哪些路徑下的網頁可以訪問這個Cookie。

5. 過期時間:Cookie的有效期限,可以是在一次會話結束時過期(會話Cookie),也可以是在一段時間後過期(持久Cookie)。

6. 安全標誌:標示這個Cookie是否只能在安全的HTTPS連接下傳輸。

7. HTTP Only標誌:標示這個Cookie是否只能在HTTP請求中傳輸,禁止JavaScript等客戶端腳本語言訪問。

這些資訊可以根據網站的需要和用途來設定和使用。Cookie在瀏覽器和伺服器之間傳遞,用於識別和記錄使用者的狀態和偏好設置,以提供更好的使用者體驗和個人化的服務。

以Chrome/DevTool/Application/Cookies 示範,查看到Cookies

Q: 為什麼HTTP是stateless ?
AI :

HTTP(Hypertext Transfer Protocol)是一種無狀態(stateless)的協議,這意味著每次 HTTP 請求都是獨立的,並且沒有記憶或紀錄上下文狀態的能力。

主要原因是為了確保協議的簡單性和可擴展性。當客戶端向伺服器發送請求時,伺服器處理請求並回傳響應,完成後即結束該次連線。下一次客戶端再次發送請求時,伺服器無法記憶前一次請求的狀態,因此每次請求都需要包含所有必要的資訊,如請求方式、路徑、標頭、參數等。

由於 HTTP 是無狀態的,伺服器無法自動識別用戶或追蹤用戶的會話狀態。為了實現狀態管理,通常會使用一些機制,如使用 Cookie 或在請求中傳遞身份驗證憑證(例如令牌或會話ID)來識別用戶或保持會話狀態。

然而,這也意味著伺服器需要額外的機制來管理和維護用戶的狀態資訊,並且客戶端需要在每次請求中主動提供這些資訊。這也是為何需要使用額外的技術或協議(如會話管理、狀態保持)來處理應用程式中的使用者身份驗證、會話管理等需求。

此為個人學習記錄,若有敘述錯誤請指正,謝謝。

--

--

CharisLai

Utitech 2023 ~ | ALPHA Camp Student 2022~| GitHub: https://github.com/CharisLai | ADIM Manufacture Assistant engineer 2020.11-2023.03