学习:https://www.cnblogs.com/moyand/p/9047978.html
cookie
1.cookie是存在本地浏览器,每次请求由浏览器自动放在http请求头中,大小为4kb。一般用于存储用户信息,保持登录状态。js可以通过document.cookie="userName=zz";而浏览器是通过内置方(php)来对cookie进行创建和设置失效。cookie的属性有name value maxAge domain(源)
2、cookie的查看 通过请求头 浏览器application document.cookie(cookie赋值是累加的),当设置了httpOnly后还是可以通过document.cookie设置,但是不能读取和设置server端已经设置好的值,这是因为在设置的时候,server设置的值会追加在最后,而覆盖前面的值,而保护了真正的cookie值
3、domain指定哪些主机可以接受cookie,未指定则默认为当前域名的相同来源,当设置了domain,则自动包含子域,如果Domain=mozilla.org设置了,则cookie在子域(如)上可用developer.mozilla.org。
4、参数sameSite,未来会都支持来限制第三方的cookie,设置后可以彻底防止CSRF攻击,设置为strict,最严格的参数,只有url与请求目标一致才携带cookie;设置为lax(未来会默认设置为lax),表示允许导航到目标网址的get请求,包括三种情况:链接(<a href="">)、预加载资源(<link href="" ref=prerender>)、get表单(form method="get" action="")可携带cookie;设置为Set-Cookie: widget_session=abc123; SameSite=None; Secure表示关闭该参数,Secure表示Cookie 只能通过 HTTPS 协议发送)
// 一般以域名命名cookie
setcookie('cookie_login', "dream", time()+3600*24*7, "/");
// 设置cookie过期
setcookie('cookie_login', "", time()-10, "/")
// 判断是否在有效期
// isset()
session
- 一开始直接存储用户名和密码,不安全,后来提出sessionId,将用户信息和sessionId的映射关系存储在服务端,客户端存储sessionId(一般放在cookie里),请求时携带上sessionId,服务端进行用户信息的匹配,保护了用户信息,但是session存储在服务器内存,增加了服务器的压力,并且难以进行集群中的用户信息同步。
token
- 为了解决服务端存储用户信息浪费性能的问题上,提出了token,可以理解为一种加密的手段
1、生成:当用户登录之后,给用户通过算法(可以基于用户名和密码但是不限于)生成一个序号,再经过服务端密钥加密;
2、设置:token需要客户端进行存储和设置到请求头,可以用于移动端。
3、验证:服务端通过密钥进行解密,能够解密成功则通过用户验证,减轻了服务端压力。
4、拓展:无状态的存储方式,无需服务端的同步,用于服务集群的拓展。
5、安全:可以不携带用户信息,并且通过签名(可以只进行加签对比)进行加密,无法被获取和破解,在服务端可以进行过期刷新(刷新当前token的有效期或者进行token的重置)
storage
2.H5新增的两种api:localStorage是永久的数据储存,sessionStorage是在当前窗口下同源窗口始终存在的数据,大小均是5MB 存储方式为字符串,存储在客户端,不与服务端进行交互
可以通过JSON.stringify()和JSON.parse()进行转换存储对象。
单点登录
https://www.jianshu.com/p/75edcc05acfd
实现在一个系统登录后在其他子系统也可以进行保持登录状态的登录方式,这个登录的
1、同一个域名下使用全局cookie进行登录验证
2、不同域名下,通过SSO域下存储伪全局cookie进行认证,返回ticket作为标记
- 客户端第一次登录子系统a,发现没有认证则去SSO登录系统进行登录核验
- 没有登录则重定向到登录页面进行登录,登录完成后返回SSO域的cookie,之后客户端携带ticket客户端向子系统a登录,子系统没有登录,返回SSO验证,通过ticket和子系统a,SSO生成子系统a的cookie,返回客户端,以后客户端就携带此子cookieA进行访问
- 客户端第一次登录子系统b,发现没有登录,则去SSO进行登录验证,通过验证请求中携带的SSO域名下的cookie发现已经登录过,SSO向客户端返回ticket标记,后客户端携带ticket访问b系统,b系统尚未登录,则返回到SSO会根据ticket和b子系统给子系统b生成一个对应的cookieB
- 之后的每次请求,都通过携带自身域名的cookie进行用户状态验证
3、只能设置和读取当前域名或更高级别的域名设置了cookie,设置了之后子域会自动携带cookie吗?
这里需要根据请求来看 使用fetch (ajax)不论同域名还是跨域都不会携带,除非设置credientals字段(credientals: true);如果是axios或jQuery请求则同域自动携带而跨域需要设置跨域的widthCredentials和CORS的跨域配置 Allow-Contronl-Access-Crediental字段(withCredictals: true)
网友评论