session和cookie有什么区别,分别适用什么场景?

大家好,我是IT修真院郑州分院一枚正直纯洁善良的后端程序员,今天给大家分享一下,修真院官网java(职业)任务5,

深度思考中的知识点——session和cookie有什么区别,分别适用什么场景?

1.背景介绍

什么是session?

session 从字面上讲,就是会话。

HTTP是无状态协议,也就是没有记忆力的协议,每个请求之间无法共享数据。

这就无法知道会话什么时候开始,什么时候结束,也无法确定发出请求的用户身份。这说明需要使用额外的手段来跟踪会话

2.知识剖析

session讲解

服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。

这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。

Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制。

它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中。在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。

其实并不是Session消失了,而是Session ID变了,服务器端可能还是存着你上次的Session ID及其Session 信息,只是他们是无主状态,也许一段时间后会被删除。

什么是cookie?

Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据。

* 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。

* 当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。

* Cookie就是服务器保存在客户端的数据!

* Cookie就是一个键值对!!!

cookie主要包括:

名字:name,必选参数,这个是cookie的变量名

值:value,可选参数,这个cookie变量的值

过期时间:cookie的生命周期,以秒为单位,Cookie.setMaxAge()

                  cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie

                  cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。

                  如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了

路径:路径就是跟在域名后面的URL路径,一般设置为”/“,Cookie.setPath("/");

域:域可以指定某一个域比如.google.com,路径与域合在一起就构成了cookie的作用范围

3.常见问题

session和cookie区别?

1、Cookie 在客户端(浏览器),Session 在服务器端。

2、Cookie的安全性一般,他人可通过分析存放在本地的Cookie并进行Cookie欺骗。在安全性第一的前提下,选择Session更优。重要交互信息比如权限等就要放在Session中,一般的信息记录放Cookie就好了。

3、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。

4、Session 可以放在 文件、数据库或内存中,比如在使用Node时将Session保存在redis中。由于一定时间内它是保存在服务器上的,当访问增多时,会较大地占用服务器的性能。考虑到减轻服务器性能方面,应当适时使用Cookie。

5、Session 的运行依赖Session ID,而 Session ID 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie,Session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 Session ID)。

6、用户验证这种场合一般会用 Session。因此,维持一个会话的核心就是客户端的唯一标识,即Session ID。

什么场景适用于session?什么场景适用于cookie?

cookie

用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

只要添加了就一直存在,只要不是手动的去清除或者expires为默认的过期时间。但是安全性无法保证,而且也无法对客户的喜好进行定量的分析,有个数和长度的限制。

session

对话的时效性的问题,如果客户选购商品的途中浏览器突然关闭,服务端找不到cookie中的sessionid了,那么选购的商品就不存在了

session是实现购物车的另一种方法。session提供了可以保存和跟踪用户的状态信息的功能,使当前用户在session中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,

它与cookie最重大的区别是,session将用户在会话期间的私有信息存储在服务器端,提高了安全性。在服务器生成session后,客户端会生成一个sessionid识别号保存在客户端,以保持和服务器的同步。

这个sessionid是只读的,如果客户端禁止cookie功能,session会通过在URL中附加参数,或隐含在表单中提交等其他方式在页面间传送。因此利用session实施对用户的管理则更为安全、有效。

4.编码实战

5.扩展思考

token是什么?

token,就是我们常说的用户身份令牌。

只有涉及到受限资源的访问时候才需要身份令牌,所以,在访问开放资源时候http中是没有token的信息的,也即是说这时候会话是完全无状态的。

token的是在用户登录以后生成的。用户登录之后我们会生成一个token作为key保存用户的信息并返回给客户端。保存方式set(token,用户信息)存储到redis等介质。

之后客户端发起的请求只要在请求头中附带token的信息就可以完成身份认证。

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。

该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。

JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

jwt有3个组成部分,分别是

头部(header)

载荷(payload)

签证(signature)

Jwt的头部承载两部分信息:

声明类型,这里是jwt

声明加密的算法,通常直接使用HMACSHA256,就是HS256了

然后将头部进行base64编码构成了第一部分:

Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。

第二部分:载荷。

这里是承载消息具体内容的地方。

内容又可以分为3中标准“

1.标准中注册的声明

2.公共的声明

3.私有的声明

也是base64编码,任何人获取到jwt之后都可以解码

签证

签证用来干啥的,其实就是一个签名信息,使用了自定义的一个密钥然后加密后的结果,

目的就是为了保证签名的信息没有被别人改过!(也就是保证jwt安全可用)

6.参考文献

https://www.itcodemonkey.com/article/11254.html

https://www.cnblogs.com/linguoguo/p/5106618.html

7.更多讨论

  1. cookie的规范

* Cookie通过请求头和响应头在服务器与客户端之间传输;

* Cookie大小限制在4KB之内;

* 一台服务器在一个客户端最多保存20个Cookie;

* 一个浏览器最多可以保存300个Cookie;

虽然Cookie规范是如此,但在今天,浏览器厂商的竞争异常激烈,所以多少会超出Cookie规则的限制。但也不会超出过多!

2.什么是会话?

举个例子

* 用户拨打10086,从服务台接通后会话开始;?

* 用户发出话费查询请求,服务台响应。这是该会话中的一个请求;? 

* 用户发出套餐变更请求,服务台响应。这是该会话中的又一个请求;

*用户挂断电话,会话结束。

3.Token 的身份验证过程

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

1.客户端使用用户名跟密码请求登录

2.服务端收到请求,去验证用户名与密码

3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里

5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

分享到此结束

PPT链接 视频链接

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

------------------------------------------------------------------------------------------------------------
“我们相信人人都可以成为一个工程师

技能树.IT修真院

发布了775 篇原创文章 · 获赞 1092 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/105397596