前言
本文的大概内容:
在浏览网页的时候输入密码会弹出是否保存账号与密码,点击保存 或者点击一段时限免登录,再次上网会保存你上次输入的密码与账号,方便了用户访问,有效避免了用户会忘记密码,但也有弊端就是,下一个人如果登录这个页面出现的用户名并不是他自己的,会泄露隐私。对于互联网行业面试的时候,计网方面的知识也总是离不开Sessio与Cookie,下面就让我们从基本知识与实践来说明二者的区别
一、Session是什么?
Session就是一次浏览器和服务器的交互的对话,就相当于人们打招呼的过程,这段对话完成后,这次会话也就结束了。
起源
在说session是什么之前,我们要清楚为什么会出现session会话,出现的机理又是什么?我们知道,用浏览器打开一个网页,用的是HTTP协议,在web 1.0时期,强调的是资源共享,http协议是一种无状态协议,2.0之后,强调交互,意味着有多一步的操作,请求与被请求之间是有依赖存在的,引入了session和cookie机制来实现状态的记录。
主要作用
HTTP是一种不保存的状态,即无状态协议(stateless)协议。也就是说HTTP协议自身不对请求和响应之间的通信状态进行保存。那么我们保存用户状态呢?Session机制的存在就是为了解决这个问题,Session的主要作用是通过服务端记录用户的状态。典型的场景是登录网站,当你要在网页端登录账号的时候,系统不知道哪个用户操作的,因为HTTP协议是无状态的。服务端给特定的用户创建特定的Session之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个Session,比如某网站可以勾选十天内免登陆,过了时间限制,就销毁这个Session了,就需要重新登录)。
在服务端保存Session的方法很多,最常用的就是内存和数据库。既然Session存放在服务器端,那么我们如何实现Seesion跟踪呢?
Session跟踪
通过在Cookie中附加一个Seesion ID来追踪Session,Session ID会以类似于cookie的方式返回给客户端,Session ID是服务器用来识别操作存储Session指的对象的服务器端,它就是用来识别这个文件或者识别
数据库的某一条记录,Session ID并不是session的值,有session ID不一定有session
二、Cookie是什么?
Cookie,有时也用复数形式Cookies
- 中文译名:小甜饼
- 起源:Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。 Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。
- 客户端(浏览器)在发送请求的时候,会自动将存活可用的cookie封装在请求头中和请求一起发送。
- 形式:请求信息头:Cookie -
用途
服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。
生存周期
Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。
Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭页面时,就马上清除Cookie,不会记录用户信息,更加安全。
在浏览器中可以定制
脚本攻击
尽管cookie没有病毒那么危险,但它仍包含了一些敏感信息:用户名,计算机名,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。
这并非危言耸听,一种名为Cross site scripting的工具可以达到此目的。在受到Cross site scripting攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价值。
cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手段进入用户帐户。
cookie毒药:利用安全机制,攻击者加入代码从而改写cookie内容,以便持续攻击。
Cookie360百科
三、Token是什么?
JWT(JSON Web Token)本质上就是一段签名的JSON格式的数据。由于它是带有签名的,因此接受者可以验证它的真实性。JWT就是一种不需要自己存放Session信息就能实现身份验证。
JWT由三个部分构成:
- Header(算法):描述JWT的元数据。定义了生成签名的算法以及Token的类型。
- Payload(负载/有效期):用来存放实际需要传递的数据
- Signature(签名):服务器通过Payload、Header和一个密钥(secret)Base64编码使用Header里面指定的签名算法(默认是HMAC SHA256)生成。
四、Session与Cookie的区别
特征: session和cookie都是由服务器来生成的,都会用来存储特定的键值对,
生命周期:
- cookie
cookie的生命周期受两个因素的影响:cookie自身的存活时间:是服务器生成cookie去设定的,创建开始计时,过期自动销毁。(30min)
客户端是否保留了cookie。客户端是否保留cookie,只对客户端自身有影响,对其他封包工具没有影响
创建开始计时 再访问再重新计时
- session
session的生命周期也是收到两个因素的影响:服务器对于session对象的保存的最大时间的设置
cookie和session都是有其作用域的
安全性:
cookie是存储在客户端的,是可见的,是可以改变的,存在客户端(浏览器)设置站点保存20个cookie。
session是存储在服务器端的是不可见的,是不可以改变的 存在服务器端 设置站点无限制。
五、过程
Session进行身份验证
- 用户向服务器发送用户名和密码用于登陆系统。
- 服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储起来
- 服务器向用户返回一个 SessionID,写入用户的 Cookie 当用户保持登录状态时, Cookie将与每个后续请求一起被发送出去
- 服务器可以将存储在 Cookie上的 Session ID与存储在内存中或者数据库中的
- Session信息进行比较,以验证用的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。
Token进行身份验证
- 用户向服务器发送用户名和密码用于登陆系统。
- 身份验证服务响应并返回了签名的JWT,上面包含了用户是谁的内容。
- 用户以后每次向后端发请求都在Header中带上JWT。
- 服务端检查JWT并从中获取用户相关信息。
总结
以上就是对于Http中的关于Session、Cookie与Token的一些浅显的理解,互联网小白一枚,有错误请批评指正,一起加油!