【网络通信与信息安全】之深入分析Token、session和cookie的使用场景和区别
在 Web 开发领域,相信大家对于 Cookie 和 Session 都很熟悉,Cookie 和 Session 都是会话保持技术的解决方案。随着技术的发展,Token 机制出现在我们面前,不过很多开发者对于 Token 和 Cookie、Session 的区别及使用场景分辨不清。
session 和 cookie
一、什么是 session 和 cookie
- 首先要知道HTTP请求是无状态的,也就是不知道这一次的请求和上一次请求是否有关系,比如我们登录一个系统的时候,验证用户名密码之后,打开系统各个页面的时候就不需要再进行登录操作了,直到我们主动退出登录或超时退出登录;这里为了避免访问每个都登录一下,就要用到 session、cookie;
- cookie 是在客户端(浏览器)保存用户信息的一种机制;而且每种浏览器存储大小会有一些差异,一般不超过4KB;
- session是在服务端保存,可以用于记录客户状态,比如我们经常会用 session 保存客户的基本信息、权限信息等;用户第一次登录之后,服务器就会创建一个 session,浏览器再次访问时,只需要从该 session 中查找该客户的信息就可以了。
二、Cookie 和 Session 的用途
- 要知道我们访问网站都是通过 HTTP 协议或 HTTPS 协议来完成的,HTTP 协议它本身是无状态的协议(即:服务器无法分辨哪些请求是来源于同个客户)。而业务层面会涉及到客户端与服务器端的交互(同网站下多个页面间能共享数据),此时服务器端必须要保持会话状态,这样才能进行用户身份的鉴别。
- 由于 HTTP 无状态的特性,如果要实话客户端和服务器端的会话保持,那就需要其它机制来实现,于是 Cookie 和 Session 应运而生。
- 通常情况下,Session 和 Cookie 是搭配在一起使用的。
Token
一、为什么会产生Token?
在这里会有个问题,服务器要保存所有用户的 session 信息,开销会很大,如果在分布式的架构下,就需要考虑 session 共享的问题,需要做额外的设计和开发,例如把 session 中的信息保存到 Redis 中进行共享;所以因为这个原因,有人考虑这些信息是否可以让客户端保存,可以保存到任何地方,并且保证其安全性,于是就有了Token。
二、什么是Token?
- Token 是服务端生成的一串字符串,可以看做客户端进行请求的一个令牌。
- 当客户端第一次访问服务端,服务端会根据传过来的唯一标识 userId,运用一些加密算法,生成一个 Token,客户端下次请求时,只需要带上 Token,服务器收到请求后,会验证这个 Token。
- 有些公司会建设统一登录系统(单点登录),客户端先去这个系统获取 Token,验证通过再拿着这些 Token 去访问其他系统;API Gateway 也可以提供类似的功能,我们公司就是这样,客户端接入的时候,先向网关获取 Token,验证通过了才能访问被授权的接口,并且一段时间后要重新或者 Token。
- Token 俗称为“令牌”,它的构成是:
- uid:用户唯一身份标识;
- timestamp:当前时间戳;
- sign:签名字符串,防止第三方伪造数据;签名密钥是存储在服务器端的,其它人无法知道;
- 其它附加参数。
三、基于Token的认证流程
- 客户端使用用户名、密码做身份验证;
- 服务端收到请求后进行身份验证(也可能是统一登录平台、网关);
- 验证成功后,服务端会签发一个 Token 返回给客户端;
- 客户端收到 Token 以后可以把它存储起来(可以放在);每次向服务端发送请求的时候,都要带着 Token;
- Token 会有过期时间,过期后需要重新进行验证;
- 服务端收到请求,会验证客户端请求里面的 Token,验证成功,才会响应客户端的请求;
总结
- cookie:
- 保存在浏览器中,有大小限制,有状态;
- 由于存放在客户端,所以是不安全的,人为可以清除;
- cookie 有过期时间设定,如果不设置过期时间,说明这个 cookie 就是当前浏览器的会话时间,浏览器关了,cookie 就存在了。如果有过期时间,cookie 就会存储到硬盘上,浏览器关闭不影响 cookie。下次打开浏览器,cookie 还存在;
- cookie 有大小的限制,4KB。
- session:保存在服务器中,服务器有资源开销,分布式、跨系统不好实现;
- Token:客户端可以将 Token 保存到任何地方,无限制,无状态,利于分布式部署。
【网络通信与信息安全】之深入分析Token、session和cookie的使用场景和区别相关推荐
- session和cookie的应用场景和区别
cookie存于客户端,session存于服务器端. cookie的作用是与服务器进行交互,作为http规范的一部分存在,而web storage是为了在本地存储"数据"而生. c ...
- 【微信小程序】token/session失效了该怎么跳转页面
token/session失效了,使用 wx.reLaunch 跳转到登录页面. wx.reLaunch的逻辑是关闭所有页面,打开到应用内的某个页面.这样就能回到登录页,而不用担心返回的问题了. 参考 ...
- 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理
一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...
- cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别
cookie.Session.Token.sessionStorage.localStorage简介 cookie 是一个非常具体的东西,只得是浏览器里永久存储的一种数据,是浏览器实现的一种数据存储功 ...
- expires为session_面试必问:session,cookie和token的区别
点击上方蓝字关注我们 ! session,cookie和token究竟是什么 简述 cookie,session,token作为面试必问题,很多同学能答个大概,但是又迷糊不清,希望本篇文章对大家有所帮 ...
- qq空间登陆 cookie_把这篇 Session、Cookie、Token看完,和面试官随便谈人生
先看大纲: Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie ...
- qq空间登陆 cookie_看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了||CSDN博文精选...
作者:程序员cxuan Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 ...
- session 、cookie、token的区别
session session的中文翻译是"会话",当用户打开某个web应用时,便与web服务器产生一次session.服务器使用session把用户的信息临时保存在了服务器上,用 ...
- 【网络通信与信息安全】之深入解析从输入一个URL到页面加载完成的过程
一.前言 从输入一个 URL,然后按下回车到显示页面,中间发生了什么?这是一道经典的面试题,不光前端面试会问到,后端面试也会被问到.这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解 ...
最新文章
- Android Studio 初体验
- 2021年3月12日 北京格灵深瞳Java开发实习面试(一面)
- KafkaProducer初始化时涉及到哪些核心组件?
- python电商项目源码_Python Django(WEB电商项目构建)
- python图片识别-Python+Opencv识别两张相似图片
- C语言基础:C语言指针(6) - 指针和字符串
- ibm+x3650+m4+linux+raid驱动,IBM X3650M4阵列卡驱动下载
- linux指令查看tomcat日志
- Nhibernate.hbm2ddl.auto配置详解
- java接收前台tex格式t数据_java 下载文件时,设置response.setContentType 根据文件类型...
- web.xml 报错
- code principles
- 基于邮件推拉技术的数据库远程数据同步解决方案
- 程序员头发都是怎么没的?第二个原因扎心了!
- 【剑指offer】JZ55 二叉树的深度 python
- 北斗导航 | EagleEye2000:国产激光雷达走进测绘世界
- android学习笔记之磁场传感器制做指南针
- 【R语言】实验五 综合应用
- 《向上生长》九边 读后感
- lol人物模型提取(一)
热门文章
- 出现“ORA-28000:the account is locked”的解决办法
- 1.8-1.10 大数据仓库的数据收集架构及监控日志目录日志数据,实时抽取之hdfs系统上...
- R语言里面的循环变量
- MacOS安装react。问题 -- npm全局包的权限问题
- 前端--3、JavaScript
- php中empty(), is_null(), isset()函数区别
- 在C#中利用SharpZipLib进行文件的压缩和解压缩
- 未处理的异常:进程性能计数器已禁用
- linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
- string转换bigdecimal_使用MapStruct处理恼人的bean转换