http一种无状态协议,即客户端与服务端的通信都必须再次与服务端链接,但是这里就有一个问题,如何判断两次发送请求的人是同一个人,服务器但从网络链接上不知道客户的身份,主要是通过颁发通行证来确认客户的身份。
首先来说一下cookie、session、token存在的作用和必要性
1.cookie、session、token都是用于客户端到服务端之间互相访问的用户标识,需要知道发起请求的客户端是否是用户自己发起的,所以才出现了cookie、session、token,就像让每个客户端即登录这台客户端的用户有自己的用户身份标识。
cookie:
cookie是浏览器中存储的一种数据,是浏览器实现一种数据存储功能,由服务器颁发给客户端,cookie保存时间可以在程序中设置,如没设置保存时间,浏览器关闭cookie自动消失。
cookie有存储大小限制,4KB左右
浏览器每次请求都会携带cookie在请求头中,这个可以用bp抓包查看
字符编码未Unicode,不支持直接存储中文
数据可以被轻易查看
cookie属性:
属性名称 | 属性含义 |
name | cookie的名称 |
value | cookie的值 |
comment | cookie的描述信息 |
domain | 可以访问该coojie的域名 |
expires | cookie的过期时间,具体的某一时间 |
maxAge | cookie的过期时间,比如多少秒后cookie过期 |
path | cookie的使用路径 |
secure | cookie是否使用安全协议传输,如ssl等 |
version | cookie使用的版本号 |
isHttpOnly | 指定该cookie无法通过JavaScript脚本拿到,比如Document.cookie属性、XMLHttpRequest对象和Reqest API都拿不到该属性。这样防止cookie被脚本读取,浏览器发出http请求时,才会带上该cookie |
cookie工作原理:
客户端向服务器发送请求,服务器向客户端颁发cookie以记录该用户的状态,客户端把从浏览器颁发的cookie保存起来,当浏览器再次请求该网站时,浏览器把请求的地址跟cookie一起发给服务器,服务器再检查cookie,来辨别用户状态,服务器还可根据需求修改cookie内容。
客户端向服务器发送请求,服务器向客户端颁发cookie记录该用户的状态,客户端收到浏览器颁发的cookie保存起来,来辨认用户状态,服务器还可根据需求修改cookie内容
1.客户端到服务端:发送登录请求
2.服务端到客户端:响应请求并设置响应头set-cookie
3.客户端再次发送请求:发送其它请求并自动携带cookie
4.服务端通过客户端的请求:cookie验证通过正常响应请求
cookie功能需要浏览器支持,如果浏览器不支持cookie或者把cookie禁用了,cookie功能会失效,不同浏览器采用不同方式保存cookie,如:IE浏览器会以文本文件形式保存,一个文本文件保存一个cookie
同时cookie具有不可跨域名性,浏览器判断一个判断是否能能操作另一个网站cookie的依据是域名
cookie的几个特点:
cookie存储在客户端
cookie不可跨域,如果设置了domain,那么是可以在一级域名和二级域名之间共享的
session:客户端信息session保存在服务器上
session就是会话的意思,主要有服务端创建,主要作用是用于保存sessionld,用户与服务端之间的权限确认主要是通过sessionld。
session由服务端创建,当请求发送到服务端时,服务器会检索请求丽是否包含sessionld标识,如包含sessionld,则代表服务端已经和客户端创建过session,可以通过这个sessionld去查找真正的session,如没找到,则为客户端创建一个新的session,并生成一个新的sessionld与session对应,然后在响应的时候将seeionld给客户端,通常时存储在cookie中。如果请求中找到真正的session,验证通过,正常处理该请求。
session是另一种记录客户状态机制,但cookie保存在客户端浏览器中,而session保存在服务器上上,客户浏览访问服务器时候,服务器把客户端信息记录在服务器上,这就是session,客户端浏览器再次访问时只需要从服务器存储的session中查找该客户的记录
总结:每一个客户端与服务端连接,服务端都会为该客户端创建一个session,并将session的唯一标识seesionld通过设置Set-Cookie头的方式响应给客户端,客户端将sessionld存到cookie中。
一般来说,cookie是结合session来使用的,也可以单独使用cookie或者session。
客户端和服务端通信时cookie和session的创建使用过程:
1.客户端访问服务端:客户端发送登录请求到服务端
2.服务端到客户端:创建一个session,并将session的唯一标识sessionld设置在Set-Cookie响应头中,响应给客户端
3.客户端到服务端:发送其它请求并自动携带cookie,服务端通过sessionld找到session,没有找到session则重新创建session
4.服务端到客户端:cookie验证通过正常响应请求
cookie与session的区别
1.cookie与session是通过sessionld关联的,sessionld是设置在Set-Cookie响应头中,客户端将sessionld存在cookie中。session是基于cookie实现的。
session比cookie更加安全,因为存储在服务端,cookie存储在客户端
cookie只支持存储字符串数据,session可以存储任意数据
cookie有效期可以设置较长时间,session有效期都比较短
session存储空间很大,cookie有限制
鉴权:可单独使用cookie,也可单独使用session,建议结合两者使用。
cookie与session认证的缺点
session比cookie更加安全,因为是存储在服务端,cookie是存储在在客户端的
cookie只支持存储字符串数据,session可以存储任意数据
cookie的有效期可以设置较长时间,session有效期都比较短
session存储空间大,cookie有限制
系统鉴权:可以单独使用cookie,也可以单独使用session,建议两者结合使用
token:
什么是token:
token是一段被加密后的字符串,通常使用uid(用户唯一标识),时间戳,签名以及一些其他参数加密而成,将token进行解密就可以拿到如uid这种信息,然后通过uid进行鉴权操作
token如何生成:
token是由服务器生成,然后返回给客户端,客户端手动把token存下来,如利用localstorage或者直接存储到cookie中
token认证:
1.客户端发起登录请求,如用户输入用户名和密码登录后
2.服务端校验用户名和密码,将用户id和其它信息进行加密,生成token
3.服务端将token响应给客户端
4.客户端收到响应后将token存储下来
5.下一次发送请求后需要将token携带上,比如放在请求头中或其它地方
6.服务端token后检验,校验通过则正常返回数据
cookie、session、token的总结
cookie、session、token都是用来鉴权认证的方式