什么是cookie
Cookie 其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie 。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie 一同提交给服务器。服务器检查该Cookie ,以此来辨认用户状态。服务器还能够根据须要修改Cookie 的内容。算法
- Cookie 存储在客户端: Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
- Cookie 是不可跨域的: 每一个 Cookie 都会绑定单一的域名,没法在别的域名下获取使用,一级域名和二级域名之间是容许共享使用的(靠的是 domain)。
属性 | 说明 |
---|---|
name=value | 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型 - 若是值为 Unicode 字符,须要为字符编码。 - 若是值为二进制数据,则须要使用 BASE64 编码。 |
domain | 指定 cookie 所属域名,默认是当前域名 |
path | 指定 cookie 在哪一个路径(路由)下生效,默认是 '/'。 若是设置为 /abc ,则只有 /abc 下的路由能够访问到该 cookie,如:/abc/read 。 |
maxAge | cookie 失效的时间,单位秒。若是为整数,则该 cookie 在 maxAge 秒后失效。若是为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。若是为 0,表示删除该 cookie 。默认为 -1。 - 比 expires 好用。 |
expires | 过时时间,在设置的某个时间点后该 cookie 就会失效。 通常浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除 |
secure | 该 cookie 是否仅被使用安全协议传输。安全协议有 HTTPS,SSL等,在网络上传输数据以前先将数据加密。默认为false。 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。 |
httpOnly | 若是给某个 cookie 设置了 httpOnly 属性,则没法经过 JS 脚本 读取到该 cookie 的信息,但仍是能经过 Application 中手动修改 cookie,因此只是在必定程度上能够防止 XSS 攻击,不是绝对的安全 |
什么是session
- session 是另外一种记录服务器和客户端会话状态的机制
- session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
session 认证流程:数据库
- 用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话)中
- 发给客户端的session_id存放到cookie中,这样用户客户端请求时带上session_id就能够验证服务器端是否存在session数据,
- 以此完成用户的合法校验,当用户退出系统或session过时销毁时,客户端的session_id也就无效了。
Cookie 和 Session 的区别
- 安全性: session 比 Cookie 安全,session是存储在服务器端的,Cookie 是存储在客户端的。
- 共同点:cookie和session都是用来跟踪浏览器用户身份的会话方式
- 有效期不一样: Cookie 可设置为长时间保持,好比咱们常常使用的默认登陆功能,Session 通常失效时间较短,客户端关闭(默认状况下)或者 Session 超时都会失效。
- 存储大小不一样: cookie数据保存在客户端,保存数据不安全且存储数据量有限;
- session数据保存在服务器端,保存数据安全且存储数据量大,session是基于cookie进行信息处理的, 可是当访问量过多,会占用过多的服务器资源。
什么是 token (令牌)
- 简单 token 的组成: uid(用户惟一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的必定长度的十六进制字符串)
- 特色:
- 服务端无状态化、可扩展性好
- 支持移动端设备
- 安全
- 支持跨程序调用
token 的认证流程
- 客户端使用用户名、密码作身份验证;
- 服务端收到请求后进行身份验证;(也多是统一登陆平台、网关)
- 验证成功后,服务端会签发一个token 返回给客户端;
- 客户端收到Token之后能够把它存储起来(能够放在);每次向服务端发送请求的时候,都要带着Token;
- token 会有过时时间,过时后须要从新进行验证;
- 服务端收到请求,会验证客户端请求里面的Token,验证成功,才会响应客户端的请求;
- 每一次请求都须要携带 token,须要把 token 放到 HTTP 的 Header 里
- 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取session 的存储空间,从而减轻服务器的压力,减小频繁的查询数据库
- token 彻底由应用管理,因此它能够避开同源策略
token 和 session 的区别
- session:保存在服务器中,服务器有资源开销,分布式、跨系统很差实现;
- Token:客户端能够将Token保存到任何地方,无限制,无状态,利于分布式部署。
- 过时时间:Session的过时时间存在cookie的Max-age字段,Token的过时时间存在服务器
- 使用范围:Session-key的储存依赖cookie机制,不能脱离浏览器;而Token能够不依赖cookie。哪怕是在get/post请求的参数中带上来均可以,因此不少第三方的登陆\支付等API接口都是用Token这种机制