1. 程式人生 > 其它 >前後端鑑權之session-cookie

前後端鑑權之session-cookie

@

目錄

前後端鑑權之session-cookie

什麼是Cookie?

Cookie 就是訪問者在訪問網站後留下的一個資訊片段。它儲存在客戶端(通常來說是瀏覽器)。你可以把cookie當作一個map,裡邊是鍵值對,每個鍵值對有過期時間路徑指令碼可否訪問等描述資訊;描述資訊儲存在客戶端,客戶端請求時,預設會帶上cookie的名稱和值,不會帶描述資訊,通過http請求報文header中的cookie項進行傳輸;伺服器響應時,可以設定cookie

資訊,就在http響應報文的headerSet-Cookie項。

關於Cookie的詳細瞭解請參考——一文了解cookie

什麼是Session?

客戶端請求服務端,服務端會為這次請求開闢一塊記憶體空間,這個物件便是 Session 物件,儲存結構為 ConcurrentHashMapSession 彌補了 HTTP 無狀態特性,伺服器可以利用 Session 儲存客戶端在同一個會話期間的一些操作記錄。

sessioncookies 是有聯絡的,session 就是服務端在客戶端 cookies 種下的session_id, 服務端儲存session_id所對應的當前使用者所有的狀態資訊。每次客戶端請求服務端都帶上cookies

中的session_id, 服務端判斷是否有具體的使用者資訊,如果沒有就去調整登入。

Session 的儲存方式

服務端只是給 cookie 一個 sessionId,而 session 的具體內容(可能包含使用者資訊、session 狀態等),要自己存一下。儲存的方式有幾種:

  • Redis(推薦):記憶體型資料庫,redis中文官方網站。以 key-value 的形式存,正合 sessionId-sessionData 的場景;且訪問快。
  • 記憶體:直接放到變數裡。一旦服務重啟就沒了
  • 資料庫:普通資料庫。效能不高。

node.js 下的 session 處理

服務端要實現對 cookiesession

的存取,實現起來要做的事還是很多的。在npm中,已經有封裝好的中介軟體,比如 express-session - npm。它主要實現了:

  • 封裝了對cookie的讀寫操作,並提供配置項配置欄位加密方式過期時間等。
  • 封裝了對session的存取操作,並提供配置項配置session儲存方式(記憶體/redis)儲存規則等。
  • req提供了session屬性,控制屬性的set/get並響應到cookiesession存取上,並給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.jsstke部署多臺機器的時候,需要解決共享session,所以引出來session持久化問題,所以session不支援分散式架構,無法支援橫向擴充套件,只能通過資料庫來儲存會話資料實現共享。如果持久層失敗會出現認證失敗。

參考: