token,session,cookie
通俗的来说就是暗号(一串字符串或者别的),这个暗号可以用来做很多事,最常做的是身份验证。
基于session的网站身份验证流程:(传统验证流程)
因为http协议是无状态的,用户在利用账号密码登陆验证后,后面的请求,服务器无法验证用户的身份,所以,在登陆后,服务器会给客户端发session(会过期),存在cookie里,客户端登陆后的请求都带有这个session,服务器校验session,如果通过,就返回相应信息。
基于token的身份验证流程:
token也一样。
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
- 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
一个通用的标准web token:JSON Web Tokens
长这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
构成:
header.PayLoad.Signature
header:
一个是 Token 的类型,另一个是使用的token加密算法
{
"typ": "JWT",
"alg": "HS256"
}
Payload:
- iss:Issuer,发行者
- sub:Subject,主题
- aud:Audience,观众
- exp:Expiration time,过期时间
- nbf:Not before
- iat:Issued at,发行时间
- jti:JWT ID
Header和Payload都要编码成一个字符串
Signature:
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
signature = HMACSHA256(encodedString, 'secret)
Cookie:
http无状态下,浏览器客户端为了维持客户端和服务器会话状态的字段(字符串),Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。
是客户端生成的,理论上用来存储一些额外页面信息。
会存在客户端请求包的header里
session:
http无状态下,服务器为了维持客户端和服务器会话状态的字段(字符串),一般用cookie来传递
因为会占用服务器的内存,所以最好用来存一下重要的信息,如登陆信息。