项目 用户认证调研与可行性方案分析 - junruchen/junruchen.github.io GitHub Wiki
参考资料: JWT JWT认证方案实施1 JWT认证方案实施2 EGG中JWT实施方案 EGG-SESSION
一、Cookie 与 Session
Cookie存储在浏览器端,Session存储在服务端。
二、常用认证方式
注意:客户端中只有浏览器存在cookie
1、传统Cookie-Session 认证
认证流程:
- 用户录入信息登录
- 服务端验证后,创建session信息,并将sessionID存储到cookie,发送回浏览器
- 浏览器端再次发送请求时,自动带上cookie信息,服务端通过cookie中存储的sessionID获取session进行验证
缺点:
- 只能在web场景中使用
- cookie不能跨域
- 存在CSRF风险 -分布式系统,需考虑session的同步问题
2、借助redis改造Cookie-Session传统认证
浏览器端不再使用cookie,如:web使用localStorage, app使用客户端数据库。实现多客户端使用,解决跨域问题,并避免了CSRF。服务端不再使用session。
认证流程:
- 用户录入信息登录
- 服务端验证后,将用户认证信息存储到redis,并返回相应key
- 客户端接收到返回信息后,将key存储在本地
- 客户端再次发送请求时,在header带上key,服务端key获取redis中的认证信息进行验证
3、基于JWT(JSON WEB TOKEN)的token认证
认证流程:
- 用户录入信息登录
- 服务端验证后,将用户认证信息进行加密生成token,并返回给客户端
- 客户端接收到返回信息后,将token存储在本地
- 客户端再次发送请求时,在header带上token,服务端验证token
4、egg.js session机制解析
问: ctx.session.user = user
具体做了什么事?
- 用户录入信息登录
- 服务端验证后,设置
ctx.session.user = user
- egg: 将session的value信息进行加密,存储在cookie的EGG-SESS字段中,发送回浏览器
- 客户端再次发送请求时,header中自动带上cookie,egg验证EGG-SESS
三、总结与方案确定
总结:
方案 | 传统方案 | 借助redis存储 | JWT token方案 | EGG.js方案 |
---|---|---|---|---|
核心技术 | cookie + session | redis存储 | 加密算法 | cookie + session |
客户端支持 | 仅支持web | 全部支持 | 全部支持 | 仅支持web |
安全性 | 有风险 | 安全 | 安全 | 安全 |
node 多进程、多服务的影响 | 受影响,可能出现session不同步 | 不影响 | 不影响 | 不影响 |
对于node语言,在不考虑多端的情况下,可直接使用EGG.js方案。 对于其他后端语言,建议使用JWT token方案。