zoukankan      html  css  js  c++  java
  • 理解 Cookie,Session,Token 并结合 Redis 的使用

    Http 协议是一个无状态协议, 客户端每次发出请求, 请求之间是没有任何关系的。但是当多个浏览器同时访问同一服务时,服务器怎么区分来访者哪个是哪个呢?

    cookie、session、token 就是来解决这个问题的。

    cookie

    • cookie 仅仅是浏览器实现的一种数据存储功能,就是浏览器里面能永久存储的一种数据
    • 浏览器每次发生http请求,都会将请求域的 cookie 一同发给 server 端
    • server 端可以修改 cookie 并返回给浏览器
    • 浏览器端也可以通过 js 修改 cookie, 但是是有限制的,例如记录用户登录数据的某些 cookie 是禁止浏览器端随意修改的

    session

    如果说 cookie 是客户身上的“通行证”,那么 session 就是服务器上的“客户明细表”。客户第一次访问服务器,服务器会保存客户的信息,并给客户一个 cookie,下一次客户携带 cookie 访问服务器时,服务器会通过该 cookie 在客户明细表(session)中找出该用户信息,服务器就知道是哪个在访问了。

    • session 只保存在服务器上,是服务器端使用的一种记录客户端状态的机制
    • session 的使用方式是:客户端 cookie 里存 userid,服务端 session 存用户数据,客户端访问服务端的时候,根据 userid 找对应用户数据

    token

    token 也称作令牌, 注意在客户端里存 userid(也就是token)、用户信息、密文,而服务端只有一段加密代码,用来判断当前加密后的密文是否和客户端传递过来的密文一致,如果不一致,就是客户端的用户数据被篡改了,如果一致,就代表客户端的用户数据正常且正确。

    token 在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中。token 组成:

    · uid: 用户唯一身份标识
    · time: 当前时间的时间戳
    · sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
    · 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
    

    token 认证流程与 cookie 类似:

    1. 用户登录,成功后服务器返回Token给客户端。
    2. 客户端收到数据后保存在客户端
    3. 客户端再次访问服务器,将 token 放入 headers 中
    4. 服务器端校验。校验成功则返回请求数据,校验失败则返回错误码(401)
    

    redis:

    redis 和 mysql 区别

    • redis 是 web server 最常用的缓存数据库,数据存放在内存中, 可存储的数据量较小,但是读取速度较快
    • 相比于 mysql, mysql 是关系型数据库,存储在硬盘中,可存储的数量较大,但是读取速度较慢
    • redis 和 mysql 一般配合使用

    为何 session 或 token 更适合存储在 redis

    • session 或 token 访问频繁,对性能要求极高
    • session 或 token 不必但是丢失数据(丢失后,用户只需要重新登录即可)
    • 与其他存储在 mysql 中的数据相比,session 或 token 的数据量较小

    为何其他网站数据不适合存储在 redis

    • 防止数据丢失
    • 数据量大,内存成本高
    • 操作频率不高
  • 相关阅读:
    前端各类网站
    冒泡排序(Bubble Sort)
    实现标签名右对齐,文本框左对齐
    html5新增标签
    Javascript--this--学习笔记
    Javascript原型学习笔记
    Javascript作用域学习笔记
    python嵌入到C++的一些理解
    python入门最佳实践
    ActionBar的一些理解
  • 原文地址:https://www.cnblogs.com/cckui/p/10967266.html
Copyright © 2011-2022 走看看