《干货系列》_相关基础_用户认证(Cookie、Session、Token、JWT)

1.认证
通俗地讲就是验证当前用户的身份

2.授权
用户授予第三方应用访问该用户某些资源的权限

3.凭证
实现认证和授权的前提是需要一种媒介(证书) 来标记访问者的身份

4.Cookie

  • cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
  • cookie 是不可跨域的: 每个 cookie都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
  • cookie的名称和对应的值都必须是字符串类型

4.Session

  • session 是另一种记录服务器和客户端会话状态的机制
  • session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
  • session 认证流程:SessionID 是连接 Cookie 和 Session 的一道桥梁
    1、用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session
    2、请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器
    3、浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名
    4、当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
    在这里插入图片描述

5、Cookie与Session的区别

  • 安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
  • 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
  • 有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
  • 存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于
    Cookie,但是当访问量过多,会占用过多的服务器资源。

6、Token
token 有两种 Acesss Token和Refresh Token

  • Acesss Token 【访问资源接口(API)时所需要的资源凭证】
    1、简单 token 的组成:【uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)】
    2、特点:服务端无状态化、可扩展性好、支持移动端设备、支持跨域调用。
    3、token的身份验证流程
    【客户端使用账号密码登录】
    【服务端收到请求,验证用户名和密码】
    【验证成功后,服务器端签发一个token,并把这个token发送到客户端,(把 token 放到 HTTP 的 Header 里)】
    【客户端收到token后,把它存起来,一般是放在cookie,localStorage中】
    【客户端每次向服务端请求资源的时候需要带着服务端签发的 token】
    【服务端收到请求,需要先验证token,验证成功则返回客户端请求的数据】
    在这里插入图片描述
    4、特点
    【基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库】
    【token 完全由应用管理,所以它可以避开同源策略】
  • Refresh Token
    1、简介
    【专用于刷新 access token 的 token,如果没有 refresh token,也可以刷新 access token,但每次刷新都要用户输入登录用户名与密码,会很麻烦。有了 refresh token,可以减少这个麻烦,客户端直接用 refresh token 去更新 access token,无需用户进行额外的操作。】
    2、如何实现刷新Acess Token
    【Access Token 的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。】
    在这里插入图片描述

7、Session和Token的区别

  • Session是一种记录服务器和客户端回话状态的机制,存储在服务端,使服务端有状态化。
  • Token是令牌,访问资源接口的凭证。Token不会存储回话信息。
  • Session认证,只是把user信息存储在服务端Session里,通过SessionId去认证。因此只需要有sessionId就能认证。不能共享SessionId给第三方应用。
  • Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。

8、JWT(Json Web Token)跨域认证解决方案
1、JWT原理
在这里插入图片描述
2、JWT认证流程

  • 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT
  • 客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)
  • 当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加
    JWT,其内容看起来是下面这样
Authorization: Bearer复制代码
  • 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
  • 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了需要查询数据库的需要
  • 因为 JWT 并不使用 Cookie 的,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)
  • 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制

3、JWT 的使用方式

  • 方式一:

当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。

 GET /calendar/v1/events
 Host: api.example.com
 Authorization: Bearer <token>

用户的状态不会存储在服务端的内存中,这是一种 无状态的认证机制
服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为。
由于 JWT 是自包含的,因此减少了需要查询数据库的需要
JWT 的这些特性使得我们可以完全依赖其无状态的特性提供数据 API 服务,甚至是创建一个下载流服务。
因为 JWT 并不使用 Cookie ,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)

  • 方式二:

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

  • 方式三
通过 URL 传输
 http://www.example.com/user?token=xxx

9、Token与JWT的区别

  • 相同:
    都是访问资源的令牌
    都可以记录用户的信息
    都是使服务端无状态化
    都是只有验证成功后,客户端才能访问服务端上受保护的资源
  • 区别:
    Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。
    JWT:将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值