前後端鑑權之session-cookie
阿新 • • 發佈:2021-11-10
@
目錄前後端鑑權之session-cookie
什麼是Cookie?
Cookie
就是訪問者在訪問網站後留下的一個資訊片段。它儲存在客戶端(通常來說是瀏覽器)。你可以把cookie
當作一個map
,裡邊是鍵值對,每個鍵值對有過期時間、域、路徑、指令碼可否訪問等描述資訊;描述資訊儲存在客戶端,客戶端請求時,預設會帶上cookie
的名稱和值,不會帶描述資訊,通過http
請求報文header
中的cookie
項進行傳輸;伺服器響應時,可以設定cookie
http
響應報文的header
中Set-Cookie
項。
關於Cookie
的詳細瞭解請參考——一文了解cookie
什麼是Session?
客戶端請求服務端,服務端會為這次請求開闢一塊記憶體空間,這個物件便是 Session
物件,儲存結構為 ConcurrentHashMap
。Session
彌補了 HTTP
無狀態特性,伺服器可以利用 Session
儲存客戶端在同一個會話期間的一些操作記錄。
session
和 cookies
是有聯絡的,session
就是服務端在客戶端 cookies
種下的session_id
, 服務端儲存session_id
所對應的當前使用者所有的狀態資訊。每次客戶端請求服務端都帶上cookies
session_id
, 服務端判斷是否有具體的使用者資訊,如果沒有就去調整登入。
Session 的儲存方式
服務端只是給 cookie
一個 sessionId
,而 session
的具體內容(可能包含使用者資訊、session
狀態等),要自己存一下。儲存的方式有幾種:
Redis
(推薦):記憶體型資料庫,redis中文官方網站。以key-value
的形式存,正合sessionId-sessionData
的場景;且訪問快。- 記憶體:直接放到變數裡。一旦服務重啟就沒了
- 資料庫:普通資料庫。效能不高。
node.js 下的 session 處理
服務端要實現對 cookie
和 session
npm
中,已經有封裝好的中介軟體,比如 express-session - npm。它主要實現了:
- 封裝了對
cookie
的讀寫操作,並提供配置項配置欄位、加密方式、過期時間等。 - 封裝了對
session
的存取操作,並提供配置項配置session
儲存方式(記憶體/redis)、儲存規則等。 - 給
req
提供了session
屬性,控制屬性的set/get
並響應到cookie
和session
存取上,並給req.session
提供了一些方法。
簡單實現
// server.js
const express = require('express')
const cookieParser = require('cookie-parser')
// 自動操作 cookie
const session = require('express-session')
// 建立伺服器應用程式
const app = express()
// 公開指定目錄
app.use('/public/', express.static('./public/'))
app.use(cookieParser())
app.use(session({ // 配置引數
secret: 'xiaan', // 加密口令
resave: true, // 重新儲存,每一次 session 修改的時候都會從重新儲存
saveUninitialized: false // 預設 true, 未初始化的時候需不需要儲存內容
}))
//當伺服器收到 get 請求 / 的時候, 執行回撥處理函式
app.get('/index', (req, res) => {
console.log(req.session)
// 判斷是否登入,如果未登入則重定向到登入
if (req.session.name !== '夏安') return res.redirect('/login')
res.send('我已經登入') // 中文框架會自動解析字串編碼格式
})
app.get('/login', function (req, res) {
req.session.name = '夏安'
res.send('請先登入')
})
app.listen(3000, () => {
console.log("http://localhost:3000");
})
缺點
cookies
安全性不好,攻擊者可以通過獲取本地cookies
進行欺騙或者利用cookies
進行CSRF
攻擊。cookies
在多個域名下,會存在跨域問題session
的資訊是儲存在服務端上面的,當我們node.js
在stke
部署多臺機器的時候,需要解決共享session
,所以引出來session
持久化問題,所以session
不支援分散式架構,無法支援橫向擴充套件,只能通過資料庫來儲存會話資料實現共享。如果持久層失敗會出現認證失敗。
參考: