准备知识

  1. 无论 Cookie 还是 Session 的相关代码,都是在后台完成的,前端不用做
  2. Cookie 是什么

Cookie 详解

  1. Session 是什么

一句话总结:

服务器通过 Cookie 给用户一个 sessionId, sessionId 对应服务器里一小块内存,每次用户访问时服务器通过 sessionId 读取对应的 Session,就知道用户信息

其中,sessionId 是一个 16 位随机数,session 是服务器一个哈希对象

Cookie 代码

登录成功的瞬间存放 Cookie

response.setHeader('Set-Cookie', `sign_in_email=${email}`)

使用

// 这样写防止 cookies 不存在
let cookies = ''
if(request.headers.cookie) {
    cookies = request.headers.cookie.split('; ')
}
// hash 拆解套路
let hash = {}
for(let i=0; i<cookies.length; i++) {
    let parts = cookies[i].split('=')
  let key = parts[0]
  let value = parts[1]
  hash[key] = value
}
console.log(hash)

Session 代码

服务器创建之前准备一块内存 (因为它必须是对所有页面的全局变量)

let sessions = {}

存放 Cookie 时改为

let sessionId = Math.random() * 10000
sessions[sessionId] = user
response.setHeader('Set-Cookie', `sessionId=${sessionId}`)

读取 Cookie 时改为

let mySession = sessions[hash.sessionId]
if(mySession) {
    email = mySession.email
}

更多

  1. Cookie 的安全问题

问题: Cookie 内容用户可以随便改(见 [Cookie详解]()),导致安全问题。比如 a 用户把 Cookie 里的用户名改为 b, 就可以看见 b 用户全部信息

解决:用 Session,它的安全性由生成 sessionId 的 16 位随机数保证。a 用户很难通过改随机数来找出 b 用户信息

  1. Session 和 Cookie 的关系

Session 基于 Cookie 实现,Cookie 是 Session 的基石

  1. Session 可以用 localStorage + 查询参数实现

    • 服务器还是准备 Session 的哈希表不变
    • 存储 Session: 服务器响应一个 JSON: {“sessionId”: xxxx} ,浏览器收到后存入 localStorage
    • 读取 Session: 浏览器将 localStorage 的 sessionId 加入url 查询参数,这样服务器就能收到并读取该 id

注:这是一个不常见的套路