项目总结 用户信息校验
用户登录
- 账号密码登录
- 授权登录
账号密码登录
直接返回用户的ID
登陆后服务器返回用户Id,后续直接根据用户Id判断为该用户操作
这种方式直接暴露用户Id,如果id设计简单容易被推测所有用户的Id
使用加密的token
登陆后服务器返回md5(用户Id),后续直接根据md5(用户Id)判断为该用户操作,这个值关联用户信息
这种方式不容易推测用户Id,但是这个值是永久的
使用session
登陆后服务器返回md5(用户Id + 盐),后续直接根据md5(用户Id + 盐)判断为该用户操作,这个值关联用户信息,设置过期时间,过期后需要重新登录
这种方式过期后需要重新登录,数据需要存储在服务器
session值放在localStorage和cookies的区别
- cookies会每次请求自动带上在请求头上,去过在没清除cookie的情况下容易发生跨站请求攻击
- localStorage需要开发者写上才能在请求中带上,可以避免跨站请求攻击
无感刷新
加大被攻击的难度
- 需要两个token: 用户信息关联的token ;刷新用的refleshToken
- 用户token是关联用户信息,refleshToken过期时间大于token的过期时间
- 当token过期后,服务器返回错误,使用refleshToken去获取最新的token
- 如果refleshToken过期,需要重新登录
- 如果refleshToken没过期,返回token,并再次执行请求
使用JWT(Json Web Token)
登陆后服务器返回JWT,后续直接根据JWT判断为该用户操作,这个值有加密后的用户信息,并且有过期时间(JWT官网的介绍)
这种方式过期后需要重新登录,数据需要存储在客户端中,传到服务器后解密jwt即可获取用户信息,可以做到不查询或者少查询数据库
组成
header
header由两部分组成:
- 类型 即JWT (type:JWT)
- 使用的加密算法(HMAC 、SHA256 或 RSA)
{
"alg": "HS256",
"typ": "JWT"
}
playload
存放明文信息
Signature
签名:需要使用header里面的算法,把header和playload使用“.”隔开,secret是自行定义的密钥
用来校验playload里面的内容有没有被修改
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)