cookie,session,token

目的:解决用户登录状态

从一个简单的登录开始说起,

在我们访问bilibili的时候,第一次需要登录,但后续就不需要登录了,可以直接访问bilibili。

而且每次在页面请求服务器的资源都需要维持登录状态,如果没有使用任何一种技术(cookie,session,token),则需要我们每次请求的时候,都需要将账号密码包含在请求中,这种方式,既不安全,也很麻烦。

那有没有什么好的解决办法呢?

这时候cookie出现了,cookie在客户端-服务器之间的流程如下:

也就是使用了cookie后,用户在第一次成功登录后,服务器会将用户的信息响应到客户端中,客户端(浏览器)会将用户信息保存到cookie中,也就是在客户端中保存了用户信息。那么在之后的每次访问服务器过程中,客户端(浏览器)会自动将cookie的内容包含在请求头(request header)中,如此便维持了用户的登录状态。

但这种方式会有很多的问题:

  • 不安全,用户信息存储在客户端,客户可以修改信息

  • 容量有限,默认4kb

  • 用户可以禁用cookie

于是,session技术出来了,不同于cookie把内容存储在客户端,session把内容信息存储在服务器端。

在用户成功登录后,服务器会生成一个sessionID,并将sessionID响应到客户端中,客户端自动将sessionID保存在浏览器的cookie中。

后续用户的访问,也会自动将sessionID包含在请求头中,服务器判断sessionID是否存在,存在则表明用户已登录,即维持登录状态。而且整个过程是自动完成的,程序员只需要往session中存数据即可,使用起来十分方便。

同样,session优缺点如下:

优点:

  • 安全性高,相比较cookie将用户信息存储在客户端,session将用户信息存储在服务器端,因此安全性较高

  • 容量大,可以保存对象

缺点:

  • 占用服务器资源,由于session容量大,因此在高并发过程中十分占用服务器资源

  • 扩展性差

  • 跨域限制

    在分布式场景中,会有多台服务器,用户登录会在其中一台服务器中生成sessionID,而其他服务器没有sessionID,如果用户的下一次请求被分发到其他服务器中,则会误判用户没有登录。

    而且在目前后端分离的大环境中,会有多个前端(web,小程序,h5,安卓端,ios端),每个端都会有各自的域名端口,这个时候,前端请求后端会有跨域,跨域情况下,cookie默认是无法传递的,而sessionID本质上还是使用了cookie,也会被限制。因此需要前端单独去设置cookie允许跨域传递。

因此,在前后端的背景下,session也不再适用,于是token技术出现了。

token其实就是一个字符串,而JWT(Json Web Token)对token进行了一个规范。

Jwt由以点(.)分隔的三个部分组成,它们是:

  • Header

  • Payload

  • Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

其形式为xxxx.xxxx.xxxx

并且可以将其解析为三个部分

Header 由Token的类型(JWT)和所使用的签名算法(HMAC SHA265)组成

Payload为有效负载,其中包含你要放的数据内容。

Signature,这部分是一个签名,是对Header和Payload数据签名,确保上面的内容不被篡改。

JWT的认证流程:

用户在登录成功后,服务器会生成一个JWT,然后将token响应到客户端,存放到request header中,之后的每次请求会带上token,服务器接收到token会解密,检查signature是否被篡改。

优点:

  • 适用于前后端分离场景和分布式项目

  • 解决了session和coookie面临的跨域和存储压力问题

缺点:

  • JWT默认不加密,因此会导致数据泄密,但可以将原始令牌加密,来传输私密信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/685792.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10000字讲解IoC 思想以及五大注解

文章目录 IoC 思想通过案例讲解 IoC1.传统的开发方式 SpringIoC 和 DI五大注解ControllerServiceComponentRepositoryConfiguration 为什么要有这么多的类注解类注解之间的关系方法注解 Bean重命名 bean扫描路径 IoC 思想 什么是 Spring 呢? 我们经常听到的都是说…

【SAP ME 38】SAP ME发布WebService配置及应用

更多WebService介绍请参照 【SAP ME 28】SAP ME创建开发组件(DC)webService 致此一个WebService应用发布成功,把wsdl文件提供到第三方系统调用接口! 注意: 在SAP ME官方开发中默认对外开放的接口是WebService接口&am…

springboot3项目练习详细步骤(第二部分:文章分类模块)

新增文章分类 接口文档 业务实现 参数校验 文章分类列表 接口文档 业务实现 获取文章分类详情 接口文档 业务实现 更新文章分类 接口文档 业务实现 分组校验 问题 概念 实现步骤 总结 删除文章分类 接口文档 业务实现 该模块大部分请求的路径相同&…

LeetCode 209 长度最小的子数组(滑动窗口and暴力)

、 法一:滑动窗口 //使用滑动窗口来解决问题 //滑动窗口的核心点有: /*1.窗口内是什么?2.如何移动窗口的起始位置?3.如何移动窗口的结束位置?4.两个指针,怎么判断哪个指针是终止指针,哪个指针…

智慧无人店运营再添黑马,萤石云值守服务显身手

许多创业者选择开店,是出于对自由生活的向往。然而,现实总会给人重重一击。老板们常常面临着熬夜看店、全年无休的困境,而选择增加雇佣员工看店又会面临着成本高昂、利润微薄的问题。“开店容易守店难”、“没有自由”成为了许多店主的共同心…

numpy1

注意:reshape函数的 - 1(是让电脑 自己计算的意思 import numpy as np n np.arange(0,25).reshape(5,5) m np.array([0,5,10,15,20])nn np.repeat(n,2,axis 1) m m.reshape(-1,1)nn[:,1:8:2] np.tile(m,(1,4)) nn[:,0:-1]

以导航产品为核心,东软想为车企扫除出海障碍

得益于新能源汽车领域多年的布局,以及在汽车智能化方面的先发优势,近年来,中国汽车品牌在质与量上都得到了极大提升,并带来强大的竞争力。 据海关总署公布的数据,过去三年,中国汽车出口规模连续突破式发展…

机器学习的一些知识点分享

下面数据集中,第2个样本的第4个属性的值是( )。 A 52 B 男 C 50 D 49 本题得分: 2分 正确答案: D 2.单选题 (2分) 10-折交叉验证是把数据集分成( )个子集,将其中&#xff…

Java数据结构(链表实战二)

前言 基于链表的操作比较多,希望通过一系列的实战操作,加深对链表的理解和应用。每日更新两题,希望学习的小伙伴关注一波,评论区欢迎讨论交流。 今日份练习 leetcode合并两个有序链表 实现原理 1.先建一个dummy的链表&#x…

智能创作时代:AI引领下的内容生产革命与效率提升

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【stm32笔记】DSP库调用

参考:DSP库调用 , __CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT1U, ARM_MATH_CM4 ,USE_HAL_DRIVER,STM32F407xx,ARM_MATH_CM4,__FPU_USED1U,__FPU_PRESENT1U,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING把需要的库复制出来单独用,方便移植

OC foudation框架(上)学习

foundation框架 文章目录 foundation框架字符串(NSString && NSMutableString)NSString的其他功能NSMutableString 日期与时间 (NSDate)2.1 日期与时间(NSDate)2.2日期格式器日历与日期组件定时器&…