咱们都知道 HTTP 是无状态(stateless)的协议:HTTP 对于事务处理没有记忆能力,不对请求和响应之间的通讯状态进行保存。 使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议自己并不保留以前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特地把 HTTP 协议设计成如此简单的。html
但是,随着 Web 的发展,早期这种无状态的特性却带来了不少不方便性,好比说用户登陆新浪微博,在登陆页输入用户名、密码以后进入首页,可是因为 HTTP 是无状态的,HTTP 并不知道上一次的 HTTP 请求是否经过了验证,更没法得知当前用户的具体信息。前端
最简单的解决方案就是在全部的请求里面都带上用户名和密码,这样虽然可行,可是大大加剧了服务器的负担(对于每一个 request 都须要到数据库验证),并且用户也要每进入一个页面输入一次密码,毫无用户体验可言。web
为此,引入了各类身份认证机制,这里说一下 Cookie-Session 和 Jwt 机制。算法
Cookie 是由 HTTP 服务器设置的,保存在浏览器中的小型文本文件,其内容为一系列的键值对。在 Chrome 中,经过开发者工具 -> Application -> Cookies 可查看 数据库
Expires:Cookie 的过时时间,默认过时时间为用户关闭浏览器时。json
HttpOnly:指示浏览器不要在除了 HTTP(或者 HTTPS)请求以外暴露 Cookie。经过 JavaScript 脚本没法访问到 Cookie,能有效防止 XSS 攻击后端
Secure:设置 Cookie 的 Secure 属性为 true
时,意味着 Cookie 通讯只限于加密传输,指示浏览器仅仅在经过安全/加密链接才能使用 Cookie。也就是说 Cookie 只有在 HTTPS 协议下才能上传到服务器,而 HTTP 协议下是没法上传的。跨域
Set-Cookie
字段,值为要设置的的CookieSet-Cookie
字段,就会将该字段的值保存在内存或者是硬盘中。Cookie
中。Cookie
字段,就知道了已经处理过这个用户的请求了。相对于保存在浏览器中的 Cookie,Session 是存储在服务器端的,避免了在客户端中储存敏感数据。而且存取方式不一样,Cookie 只能保存 ASCII 字符串,例如须要存取 Unicode 字符或者二进制数据,须要先进行编码。而Session中可以存取任何类型的数据。Session 通常配合 Cookie 使用,也就是接下来要说到的 Cookie-Session 机制。浏览器
Set-Cookie
字段,将 Cookie 保存起来JWT(JSON Web Token) 是由 RFC7519 定义的,是一个在双方之间安全的传达一组信息的 JSON 对象。安全
JWT 由三个部分组成:header、payload、signature 每一个部分中间使用 .
来分隔,其中,header 和 payload 使用 Base64URL 进行编码:
base64UrlEncode(header).base64UrlEncode(payload).signature
复制代码
header 部分是一个 JSON 对象,用来描述 JWT 的元数据:
{
"typ": "JWT", // 表示对象是一个 JWT
"alg": "HS256" // 表示使用哪一种 Hash 算法来建立签名,这里是 HMAC-SHA256
}
复制代码
payload 部分也是一个 JSON 对象,实际须要传递的数据被存放在这里。咱们除了使用官方提供的七个字段以外,也可使用自定义的私有字段。
{
"sub": "title",
"name": "Yeoman"
}
复制代码
JWT 默认是不加密的,任何人均可以读到,因此不要把秘密信息放在这个部分。
signature 是对前两个部分的签名,防止数据被篡改。
data = base64urlEncode( header ) + "." + base64urlEncode( payload );
signature = Hash( data, secret );
复制代码
使用 Base64URL 编码的 header 和 payload 中间用 .
隔开,再使用 header 中指定的 Hash 算法,加上密钥对这个字符串进行 Hash 获得 signature
Authorization
位,这样相比放在 Cookie 中能够跨域。Authorization: Bearer <token>
复制代码
这里再次复习一下相关知识: