cookie的由来
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。
怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带
自己通行证。这样服务器就能从通行证上确认客户身份了
cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据
存储功能。cookie的保存时间,可以自己在程序中设置。如果没有设置保存时
间,应该是一关闭浏览器,cookie就自动消失。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录
该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器
会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该
Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务
器还可以根据需要修改Cookie的内容。
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,
通知客户端保存Cookie。在同源策略下当浏览器再请求服务器时,
浏览器把请求的网址连同该Cookie一同提交给服务器。
服务器通过检查Cookie来获取用户状态。
Cookie一般是被浏览器以txt纯文本的形式存储在电脑硬盘中
session
Session是另一种记录客户状态的机制,不同的是Cookie
保存在客户端浏览器中,而Session保存在服务器上
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,
那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份
session有一个缺陷:如果web服务器做了负载均衡
那么下一个操作请求到了另一台服务器的时候session会丢失。
Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,
会对服务器造成压力。
Cookie与Session的区别和联系
1、 cookie数据存放在客户的浏览器上,session数据放在服务器上
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行
COOKIE欺骗,考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K
Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客
户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session
的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部
发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完
全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。
token
在大多数使用Web API的互联网公司中,tokens 是多用户下处理认证的最佳方式
以下几点特性会让你在程序中使用基于Token的身份验证
1.无状态、可扩展
2.支持移动设备
3.跨程序调用
4.安全
项目中使用token总结
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。
1.前端使用用户名跟密码请求首次登录
2.后服务端收到请求,去验证用户名与密码是否正确
3.验证成功后,服务端会根据用户id、用户名、定义好的秘钥、
过期时间生成一个 Token,再把这个 Token 发送给前端
4.前端收到 返回的Token ,把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.前端每次路由跳转,判断 localStroage 有无 token ,没有则跳转到登录页。
有则请求获取用户信息,改变登录状态
6.前端每次向服务端请求资源的时候需要在请求头里携带服务端签发的Token
7.服务端收到请求,然后去验证前端请求里面带着的 Token。没有或者 token 过期,
返回401。如果验证成功,就向前端返回请求的数据。
8.前端得到 401 状态码,重定向到登录页面。
token的起源
基于服务器的验证
我们都是知道HTTP协议是无状态的,这种无状态意味着程序需要验证每一次请求,
从而辨别客户端的身份。
在这之前,程序都是通过在服务端存储的登录信息来辨别请求的
。这种方式一般都是通过存储Session来完成。
基于服务器验证方式暴露的一些问题
1.Seesion:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。
当越来越多的用户发请求时,内存的开销也会不断增加。
2.可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。
3.CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会
是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。
4.CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,
并且能够被利用其访问其他的网站。
更高级更专业的Authing
Authing 在云上为企业和开发者提供专业的身份认证和授权服务。
专业的点下面链接看,包含
SSO auth auth2.0 jwt 扫码登录等…
https://docs.authing.cn/v2/concepts/jwt-token.html
Authing官网链接