cookie-session-token的使用
Cookie:
称为: '小甜饼' 其类型为: 小型文本文件, 某些网站为辨别用户身份而存储在用户本地终端上的数据.
浏览器会在特定的情况下携带上cookie来发送请求, 我们可以通过cookie来获取一些信息.
Cookie保存在客户端中, Cookie桉存储位置分为内存Cookie和硬盘Cookie.
内存Cookie由浏览器维护,浏览器关闭Cookie消失. 硬盘Cookie有一个过期时间,用户手动清理或者时间过期时,才会被清理
区别: 没有设置时间,默认为内存Cookie.设置过期时间且不为0,是硬盘Cookie.
Cookie常见的属性
1.expires: 设置的是Date.toUTCString(),设置格式是: ;expires=date-in-GMTString-format
2.max-age: 设置过期的秒数, ;max-age=max-age-in-seconds(常用)
Cookie的作用域
Domain: 指定那些主机可以接受cookie
如果不指定,默认为origin,不包含子域名.
指定Domain,则包含子域名. 例如: 设置Domain=xxx.org,则Cookie也包含在子域名中. 也就是说: www.xxx.org设置Cookie,在 www.video.xxx.org中也包含此Cookie
path: 指定主机下那些路径可以接受Cookie
设置 path=/users,则以下地址都会被匹配 /users/aaa , /users/music ...
注意: Cookie可以被客户端设置(document.cookie = 'name=Fhup;max-age=0;'),也可以被服务器设置.
koa中cookie的使用
const Koa = require('koa')
const Router = require('koa-router')
const app = new Koa()
const router = new Router()
router.get('/test', (ctx, next) => {
// 设置Cookie, max-age对应毫秒
ctx.cookies.set('name', 'Fhup', {
maxAge: 5000
})
ctx.response.body = '成功~'
})
// 在/demo路径中,request headers有Cookie: name=Fhup
router.get('/demo', (ctx, next) => {
const name = ctx.cookies.get('name')
ctx.body = `你的cookie是${name}`
})
app.use(router.routes())
app.use(router.allowedMethods())
app.listen('8080', () => {
console.log('cookie测试服务器');
})
Session
session是基于cookie的
const Koa = require('koa')
const Router = require('koa-router')
const Session = require('koa-session') // Session是一个函数
const app = new Koa()
const router = new Router()
// 创建Session的配置
const session = Session({
key: 'sessionid',
maxAge: 50 * 1000,
signed: true // 加密签名
}, app)
app.keys = ['aaa'] // 根据keys里的数据和其他信息生成签名
app.use(session)
// Session本质上是一个Cookie,在浏览器查看时在Cookies里
router.get('/test', (ctx, next) => {
ctx.session.user = {
id: '001',
name: 'Fhup'
} // 对数据做base64的编码进行设置
ctx.body = 'test'
})
router.get('/demo', (ctx, next) => {
console.log(ctx.session.user);
ctx.body = ctx.session.user
})
app.use(router.routes())
app.use(router.allowedMethods())
app.listen('8080', () => {
console.log('session测试服务器');
})
Cookie和Session的缺点
1.Cookie会被附加到每个http请求中,无形中增加了流量(某些请求是不需要的)
2.Cookie是明文传输的,存在安全性
3.Cookie的大小限制为4kb,对于复杂的需求来说是不够的
4.对于浏览器以外的客户端(ios,android),必须手动的设置cookie和session
5.对于分布式系统和服务器集群来说,例如: 一个服务器获取另外一台服务器和用户连接之后的session比较麻烦
Token
JWT(JSON WEB TOKEN)内部实现token(令牌)机制
JWT: 由三部分组成
1.header: (alg: 采用的加密算法,默认为:HS256) (typ: 固定值,默认为JWT) 将alg和typ进行base64Url算法进行编码
2.payload: (携带数据) (携带iat,令牌的签发时间) (设置过去时间: exp) 之后进行base64Url算法进行编码
3.signature(签名): 设置一个secretKey: 将前二个结果合并进行HS256的算法:
HMACSHA256(base64Url(header) + . base64Url(payload), secretKey)
最终生成完整的Token: header.payload.signature
koa中使用token
const Koa = require('koa')
const Router = require('koa-router')
// token要安装jsonwebtoken
const jwt = require('jsonwebtoken')
const app = new Koa()
const router = new Router()
const SECRET_KEY = '123ABC456'
router.get('/test', (ctx, next) => {
const token = jwt.sign({name: 'Fhup'}, SECRET_KEY, {
expiresIn: 30 // 单位为秒
})
ctx.body = token
})
router.get('/demo', (ctx, next) => {
// 获取Token并验证
const token = ctx.headers.authorization.split(' ')[1]
try {
const result = jwt.verify(token, SECRET_KEY)
ctx.body = result
} catch (error) {
ctx.body = 'token是无效的~'
}
})
app.use(router.routes())
app.use(router.allowedMethods())
app.listen('8080', () => {
console.log('token测试服务器');
})