Cookie,Session,Token【Codewhy NodeJS学习笔记】
为什么需要登录凭证?
- web 开发中,我们使用最多的协议是 http,但是 http 是一个无状态的协议
- 什么是无状态的协议?
- 举个例子:
- 我们登录了一个网站 www.coderhub.com
- 登录的时候我们需要输入用户名和密码:比如用户名coderwhy,密码:Coderwhy666
- 登陆成功之后,我们 要以 coderwhy 的身份去访问其他的数据和资源,还是通过 http 请求去访问
- coderhub 服务器会问:你谁呀?
- coderwhy 说:我是 coderwhy 呀,刚刚登录过呀
- coderhub:怎么证明你刚刚登录过呀
- coderwhy说:这。。。,http 没有告诉你吗
- coderhub:http 的每次请求对我来说都是一个单独的请求,和之前的请求没有什么关系
- 这就是 http 的无状态,也就是服务器不知道你上一步做了什么,我们必须得有一个办法可以证明我们登录过
认识 cookie
- Cookie(复数形态Cookies),又称为“小甜饼”。类型为“小型文本文件”,某些网站为了辨别用户身份二存储在用户本地终端(Client Side)上的数据
- 浏览器会在特定的情况下携带上cookie发送请求,我们可以通过cookie来获取一些信息
- Cookie 总是保存在客户端中,按在客户端中的存储位置,Cookie 可以分为内存Cookie和硬盘Cookie
- 内存Cookie由浏览器维护,保存在内存中,浏览器关闭时Cookie就会消失,其存在时间是短暂的
- 硬盘Cookie保存在硬盘中,有一个过期时间,用户手动清理或者过期时间到时,才会被清理
- 如何判断一个Cookie是内存Cookie还是硬盘Cookie?
- 没有设置过期时间,默认情况下cookie是内存cookie,在关闭浏览器时会自动删除
- 有设置过期时间,并且过期时间不为0或者复数的cookie,是硬盘cookie,需要手动或者到期时,才会删除
- cookie 常见的属性:
- cookie 的生命周期
- 默认情况下的cookie是内存cookie,也称之为会话cookie,也就是在浏览器关闭时会自动删除
- 我们可以通过
expire
或者max-age
来设置过期时间expire
:设置的是Date.toUTCString()
,设置格式是;expire=date-in-GMTString-format
max-age
:设置过期的秒钟,;max-age=max-age-in-seconds
(例如一年为60*60*24*365)
- cookie 的作用域:(允许 cookie 发送给哪些URL)
Domain
:指定哪些主机可以接受 cookie- 如果不指定,那么默认是 origin ,不包括子域名
- 如果指定
Domain
,则包含子域名,例如,如果设置Domain=mozilla.org
,则 Cookie 也包含在子域名中(如 developer.mozilla.org)
Path
:指定主机下哪些路径可以接受 cookie- 例如,设置
Path=/docs
,则以下地址都会匹配:- /docs
- /docs/Web/
- /docs/Web/HTTP
- 例如,设置
- cookie 的生命周期
- 客户端设置 cookie
document.cookie = 'key=value'
- 服务器端设置 cookie
const Koa = require('koa') const Router = require('koa-router') const app = new Koa() const testRouter = new Router() testRouter.get('/test', (ctx, next) => { ctx.cookies.set('name', 'lilei', { maxAge: 5 * 1000, }) ctx.body = 'test' }) testRouter.get('/demo', (ctx, next) => { // 读取 cookie const value = ctx.cookies.get('name') ctx.body = `你的cookie是${ value}`