浅谈Cookie、Session、Token、JWT

熙姝

什么是认证?
简单明了的来说就是告知服务器你是谁(你的名字、性别...)
互联网中的认证:
用户名密码登录
邮箱发送登录链接
手机号接收短信验证码
什么是授权?
简单明了来说就是管理员赋予用户访问的权限
例如:手机下载新的app使用时会让你赋予它读取相关信息的权限,这就是授权
实现授权的方式有:cookie、session、token、OAuth
什么是凭证?
凭证就是向服务器证明你自己本人而不是假冒的,类似于身份证或者户口本
Cookie是什么?
HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。每个 Web 站点能设置的 Cookie 总数不能超过 20 个
cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据(不超过4KB)。
cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
cookie时效性:目前有些 Cookie 是临时的,有些则是持续存在的。临时的 Cookie 只在浏览器上保存一段规定的时间(一般是30分钟),一旦超过规定的时间,该 Cookie 就会被清除
Session是什么?
在计算机中,尤其是在⽹络应用中,称为“会话控制”。
Session是一种HTTP存储机制是有状态的协议,目的是为无状态的HTTP提供的持久机制。所谓Session认证只是简单的把User信息存储到Session里,因为SID的不可预测性,暂且认为是安全的。这是一种认证手段。
Session是基于Cookie实现的,要记住session是存储在服务器的但是sessionID是存储在浏览器的cookie上的
SessionID 是连接 Cookie 和 Session 的一道桥梁
Token是什么?
token就是发送请求的凭证,他是怎么实现的呢?可以将它看作是一串加密的字符串,当用户第一次登录成功时服务器会生成一串由uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)组成的字符串返回给前端,前端再发送每一次请求时将这一字符串带到请求头中,然后服务器会从数据库中查询此token是否合法并做出相应的响应。
值得一提的是每次请求都会去校验此token的合法性想想如果用户多了请求量变大那么一直操作库会给库带来非常大的压力。
那么如何解决呢?
可以将每次生成的toekn存储在redis中并设置好过期时间(这是一个解决办法但是也不太好,数据量大了也会造成压力),当然还有几个好的解决方法不过都是存储在缓存中,大同小异这里就不再一一叙说
JWT是什么?
Json Web Token 简称JWT 目前最流行的跨域认证解决方案
JWT也是一串字符串,中间用点(.)分隔成三个部分,
分别是:

Header(头部)
Payload(负载)
Signature(签名)

写成一行就是下面这样
Header.Payload.Signature

接下来分别介绍着三个部分

Header: {"alg": "HS256","typ": "JWT"} 其中 alg:表示使用的算法默认是HS256 ,typ:表示token类型  然后再用Base64URL 算法进行机密生成一串字符串

Payload: 也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。
{
  iss (issuer):签发人
  exp (expiration time):过期时间
  sub (subject):主题
  aud (audience):受众
  nbf (Not Before):生效时间
  iat (Issued At):签发时间
  jti (JWT ID):编号
}
当然也可以在这一部分存储自己定义的端
Signature:这一部分就是 base64UrlEncode(header)+ base64UrlEncode(palyoad)+密钥使用alg的算法进行加密

这三者在拼接成一个字符串就是jwt

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。
JWT的特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。

(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。

(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。

(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

到这里就介绍完了,有收获的小伙伴点个赞呗!

本文jwt相关部分借鉴于http://www.ruanyifeng.com/blo...

阅读 317

默默前进的小猿

6 声望
3 粉丝
0 条评论

默默前进的小猿

6 声望
3 粉丝
文章目录
宣传栏