第一部分 认证方式
HTTP提供多种认证方式,包括BASIC_AUTH,JWT_AUTH,O_AUTH等
其中BASIC_AUTH是最基本的。它的大概流程是这样的:
1.浏览器发起请求
2.服务器返回401
3.浏览器弹出账户名密码登录,用户填写
4.浏览器发出BASE64加密完的用户名和密码数据
5.服务器收到数据解密,从HTTP服务器中找到user-passwd相关文件查看是否符合,并且SET-COOKIE
6.浏览器收到,按照SET-COOKIE中指定的方法,保存cookie在内存或持久化。并且根据域和路径,在下次访问相同网站的时候,自动携带放在Header中的cookie中
这样,认证的经过BASE64编码后的账户名和密码存在浏览器,不太安全。所以有时候,在cookie中存放一个sessionid,在服务器中存放sessionid对应的相关信息。
值得注意的是,session和cookie本身可以传递用来传递很多信息,不仅仅是认证。
然而,由于HTTP的无状态性,认证并保持登录状态,是他们的主要任务之一。
第二部分 cookie, session与token
一、cookie
cookie保存在客户端
cookie的生成
1.通常,服务器在HTTP响应头中加入一行特殊指示以提示浏览器按照指示生成相应的cookie。
2.cookie也可以由JS等脚本在客户端生成。
cookie的内容:
名字,值,过期时间,路径和域。
如果不指定过期时间,则默认为浏览器会话期间,保存在内存中。如果指定过期时间,则需要在客户端做持久化。
常用模式:
服务器在Response Header中添加set-cookie
客户端在Request Header的添加cookie
二、session
客户端保存sessionid,服务器端通过sessionid索引到具体的session信息,这个session信息存在客户端,sessonid存在客户端
通常客户端保存sessionid是在cookie中,因此session与cookie联系紧密
在服务器端分布式架构时,需要注意session的一致性问题
三、token
通常来说,cookie和session都是互联网时代的名词,sessionid本身就是一项cookie,而cookie的管理是由浏览器来完成的
token这个词是移动互联网时代的产物。相比网站要通过浏览器的cookie,APP可以直接保存信息或者信息索引。所以大家起了个新名字,token,用来在APP客户端保存一些信息。
token的特点如下:
1.token在APP持久化,可以通过放在HTTP Body发出去,可以在HTTP Header中传递,甚至通过URL发出去。
2.token既可以当做key-value中的key,类似sessionid。又可以直接将信息包含在token字符串中(比如JWT)。
3.token常被用在身份认证中,可以在发送请求时判断是否携带。而cookie与session除了身份认证信息,还常包括一些其他状态相关信息,并且由浏览器来判断是否发送。
好吧,我得承认一提到token,就会想到OAuth,但是token这个概念应该不仅仅是做第三方授权的。两者不能划等号。
done