// http无状态问题不解决,就永远不知网线那一头的人是男是女~
cookie + session
- Session称为会话状态,是开发者为了实现中断和继续等操作的抽象概念。但在cookie+session中,session被看做是一种高级会话的实现。
- cookie写在http的header中,解决了前端的无状态问题。但是由于前端的诸多限制(比如说浏览器删除cookie),导致了cookie的局限,所以使用session实现了后端的无状态问题。具体方法是在服务端保存的一个数据结构(不在内存),用来跟踪用户的状态。
- 总结:
cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现session的一种方式。session的执行依赖session id,而且session id存在cookie中。cookie和session共同作用实现了http无状态问题,cookie和session都用作维持Session。
const cookieParser = require('cookie-parser')
const session = require('express-session')
app.use(session({
secret: 'fefdfwqubgfa',
cookie: { maxAge: 60*1000*60 }, // 设置过期时间
resave: true, // 即使session未被修改也保存session
saveUninitialized: false // 无论有没有session cookie,每次请求都设置session cookie
}))
jwt
- 用户登录后服务器产生加密字符串token发给前端,前端进行保存(cookie、localstorage)。前端发起请求会携带token。服务端通过私钥验证合法性。
jwt全称是json web token
共分为三部分:header、payload、verify signature
示例如下,字符串共分为三个部分: - code:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c - decode:
header:
{
“alg”: “HS256”,
“typ”: “JWT”
}
payload:
{
“sub”: “1234567890”,
“name”: “John Doe”,
“iat”: 1516239022
}
verify signature:
{
包含私钥,将第一部分和第二部分加密后产生第三部分
}
const jwt = require('jsonwebtoken')
const secret = 'sjdiadjsasdvb'
createToken(payload) {
payload.ctime = Date.now()
return jwt.sign(payload, secret)
}
checkToken(token) {
return new Promise((resolve, reject) => {
jwt.verify(token, secret, (err, data) => {
if(err) reject('验证失败')
else resolve(data)
})
})
}
module.exports = { createToken, checkToken }