nodeJS中cookie-session-token的使用

538 阅读3分钟

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测试服务器');
})