准备知识
- 无论 Cookie 还是 Session 的相关代码,都是在后台完成的,前端不用做
- Cookie 是什么
- 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
}
更多
- Cookie 的安全问题
问题: Cookie 内容用户可以随便改(见 [Cookie详解]()),导致安全问题。比如 a 用户把 Cookie 里的用户名改为 b, 就可以看见 b 用户全部信息
解决:用 Session,它的安全性由生成 sessionId 的 16 位随机数保证。a 用户很难通过改随机数来找出 b 用户信息
- Session 和 Cookie 的关系
Session 基于 Cookie 实现,Cookie 是 Session 的基石
Session 可以用 localStorage + 查询参数实现
- 服务器还是准备 Session 的哈希表不变
- 存储 Session: 服务器响应一个 JSON: {“sessionId”: xxxx} ,浏览器收到后存入 localStorage
- 读取 Session: 浏览器将 localStorage 的 sessionId 加入url 查询参数,这样服务器就能收到并读取该 id
注:这是一个不常见的套路
暂无评论