cookie、session、token、jwt的区分
本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到1663714611@qq.com

1.cookie:

  • 什么是cookie:
  1. cookie为维护状态(因为http是无状态协议)
  2. 存储在客户端
  3. 不能跨域(靠domain,一级域名和二级域名之间是语序共享使用的)
  • cookie的重要属性
  1. name=value(键值对,设置cookie的名称及相对应的值,都必须是字符串类型)
  2. domain(指定cookie所属域名,默认当前域名)
  3. path(指定cookie在那个路径下生效,默认是’ / ‘)
  4. maxAge(失效时间,单位:秒,负数情况cookie为临时cookie,默认‘-1’)
  5. secure(当设置为true时,cookie在HTTP中无效,在HTTPS中才有效)
  6. httpOnly(如果给某个cookie设置,则无法通过JS脚本读取该cookie信息,但还能通过Application中手动修改cookie,所以只是在一定程度上可以防止xss攻击,不是绝对的安全)

2.session

  • 什么是session
  1. 是另一种记录服务器和客户端会话状态的机制
  2. 基于cookie实现,session存储在服务端
  3. sessionId会被存储到客户端的cookie中
  4. 认证流程 image.png
  • 什么是SessionID 1.是Cookie和Session的一道桥梁(验证用户登陆状态)

小结:Cookie与Session的区别

  • 安全性(Session好)
  • 存取值的类型不同(Cookie只支持字符串数据,想要设置其他类型数据需要将其转成字符串)
  • 有效期不同(Cookie可设置为长时间保持,Session(默认是客户端关闭失效)或Session超时失效)
  • 存储大小不同(Session远高于Cookie,但访问多时会占用过多的服务器资源)

——————————————————————————————————————————

3.Token(令牌)

  • 简单组成:uid(用户唯一的身份标识)+time(时间戳当时的)+sign(签名)
  • 特点:
  1. 服务端无状态、可扩展性好
  2. 支持移动端设备
  3. 安全
  4. 支持跨程序调用
  • token身份验证流程图: image.png
  • 每一次请求都要携带token,需要把token放到HTTP的Header里
  • Token类似一个令牌,无状态的,服务端所需的信息被Base64编码后放到Token中,服务器可以直接解码出其中的数据。
  • refresh token(专用于刷新access token的token)工作原理: image.png

小结:token与Session的区别

  • token(令牌)服务端无状态化、不会存储会话信息。session(记录服务端和客户端会话状态的机制)服务端有状态化,可记录会话信息。
  • 作为身份认证Token安全,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。

4.jwt(JSON Web Token)

  • jwt是什么
  1. 是目前最流行的跨域认证解决方案。
  2. 是一种认证授权机制。
  3. 可以使用HMAC算法或者RSA的公/私密钥对JWT进行签名。(因为数字签名的存在,这些传递的信息是可信的。)
  4. Jwt结构: image.png
  • Header(是一个Json对象,描述JWT的元数据,通常是下面这样子的) “`Plain Text { “alg”: “HS256”, “typ”: “JWT” }
    上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。

  - 

    #### Payload

    Payload部分也是一个Json对象,用来存放实际需要传输的数据,JWT官方规定了下面几个官方的字段供选用。

    - iss (issuer):签发人

    - exp (expiration time):过期时间

    - sub (subject):主题

    - aud (audience):受众

    - nbf (Not Before):生效时间

    - iat (Issued At):签发时间

    - jti (JWT ID):编号

    当然除了官方提供的这几个字段我们也能够自己定义私有字段,下面就是一个例子

    ```Plain Text
{  
    "name": "xiaoMing",
    "age": 14
}
默认情况下JWT是不加密的,任何人只要在网上进行Base64解码就可以读到信息,所以一般不要将秘密信息放在这个部分。这个Json对象也要用`Base64URL`算法转成字符串
  • Sianature Signature部分是对前面的两部分的数据进行签名,防止数据篡改。 首先需要定义一个秘钥,这个秘钥只有服务器才知道,不能泄露给用户,然后使用Header中指定的签名算法(默认情况是HMAC SHA256),算出签名以后将Header、Payload、Signature三部分拼成一个字符串,每个部分用.分割开来,就可以返给用户了。 HS256可以使用单个密钥为给定的数据样本创建签名。当消息与签名一起传输时,接收方可以使用相同的密钥来验证签名是否与消息匹配。
  • 认证流程(JWT原理): image.png
  • JWT的使用方式: 方法一、 当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。 “`Plain Text GET /calendar/v1/events Host: api.example.com Authorization: Bearer
  #### 方法二、

  - 

    #### 跨域的时候,可以把 JWT 放在 POST 请求的数据体里。

  #### 方法三、

  - 

    #### 通过过 URL 传输

Plain Text http://www.example.com/user?token=xxx “`

## 小结:Token与JWT的区别

  • Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。
  • JWT: 将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇