Cookie/Session和Token是什么

一 引入

HTTP是无状态(stateless)的,每次与服务器交互时,不会保留上次的状态,如用户信息。本篇文章介绍的是解决该问题的办法。该文章参考的资料有:

二 Cookie与Session

  • HTTP Cookie是服务器发送到用户浏览器并保存在客户端的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。Cookie通过Header传输,HTTP则是让客户端和服务器的协议,即让两者知道对方想干什么。

  • HTTP Cookie主要用于:

    • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
    • 个性化设置(如用户自定义设置、主题等)
    • 浏览器行为跟踪(如跟踪分析用户行为等)
  • Cookie是保存状态的一种方式,传统上直接将用户名和密码保存到cookie是很不安全的,
    所以产生了会话(session),获取浏览器访问服务器表示会话开始。

  • 客户只能通过Cookie获取sessionId,sessionId是一组无意义的随机字符。

  • Cookie通过在客户端保存信息确定用户身份Session通过在服务器端存储信息确定用户身份


用户通过登陆获取sessionid存储在cookie中并返回;用户下一次请求将携带cookie,服务端验证其sessionid,有效则无需再次登陆,直接发送主页html;无效则发送登录html,要求用户重新登陆。过程如下:

image-20220319132748134

  • 这种处理方式使服务器开销变大
  • 为防止XSS攻击(Cross-Site Scripting跨站脚本攻击),可以加上httponly后,此后无法通过js获取sessionid
  • 但是如果把信息存储在localstorage中,xss是可以取到用户登录的

三 Token

Token也称令牌,提供一种标准的方式让双方安全交互,有三类Oauth、OpenID、JWT,通常存储在localstorage中。以JWT(Json Web Token,网址:jwt.io)为例:

3.1 JWT 特点

  • 包含暂时性密码和一些信息,如用户信息和用户权限,token只要没过期,就不能设置为无效。

  • 组成:header、payload、signature。

    (1)header:包含算法类型和token类型,是json对象,采用Base64编码

    (2)payload:包含一些个人信息,如权限,但不能包含敏感信息,是json对象,采用Base64编码。

    (3)signature:对编码后的header、payload、服务器密钥,通过header指定的签名算法生成,用于后续服务器验证有效性

  • 授权:一旦用户登录,后续每个请求都携带JWT,允许用户访问该令牌允许的路由、服务和资源。

  • 每当用户授权,服务器创建header和payload并签名,返回token

  • 请求:用户请求时携带token,访问token允许的各类资源;

  • 验证:任何有公钥的服务器都可以验证签名是否合法,合法则认为payload可信,不需要额外的数据库存储就能共享状态

  • 安全性:为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

3.3 示意图

过程的故事描述:柜台(服务器)写下一些信息,任何盖章(签名),交给客户。客户以后就能拿着单子过来,不需要身份证之类来验证客户的个人信息,就能直接处理业务。柜台(服务器)只需要确认信息效就可以相信这些信息。image-20220319170255703

四 其他说明

web storage有以下两种方式

  • sessionStorage:为用户维持一个独立的存储区域,生命周期较短,当浏览器关闭时,数据随之消失
  • localStorage:同样是存储区域,但生命周期是是永久的,即使关闭浏览器,数据还是会存在
posted @ 2022-03-19 17:41  sanhuamao  阅读(92)  评论(0编辑  收藏  举报