登录

cookie session

cookie 是什么? cookie 有什么用?

  1. 浏览器的数据持久化
    • 所以关闭浏览器,cookie 数据还在
    • 同类方案:localStorage, 但是不安全, 重要数据不放里面
  2. 浏览器每次请求都会在 headers 带上 cookie
    • 同类方案:每次请求在 headers 带上 自定义字段

客户端和服务端怎么实现 cookie?

  1. 浏览器: 请求报文头的 Cookie ,每次请求都携带
  2. 服务器: 响应报文头的 Set-Cookie ,可选报字段,设置则覆盖之 详见 <./cookie格式与操作>

session 是什么? 有什么用?

  • 用户会话期, 同一用户不同请求之间的保存信息
  • 可以避免其他用户session的伪造
    • 不能避免:http环境下,网络节点上任一个代理都可以拿到 session,伪造当前用户

客户端和服务端怎么实现 session?

A) session 存在服务端的

  1. 服务端签发: 用户登录通过验证 → 随机生成session_id, 更新mapper {session_id: session} → 发送响应报文, 带上 session_id
  2. 客户端种下: 接收响应报文,cookie种下 session_id
  3. 服务端校验: session_id 是否命中 mapper

B) session 存在客户端的

  1. 服务端签发: 用户登录通过验证 → 生成 session → 发送响应报文, 带上 session密文
    • session格式:
    • 签名用的salt存服务端
  2. 客户端种下: 客户端接收响应报文,cookie种下 session
  3. 服务端校验: sha256(user原文, salt) == 签名, 知道客户端是否篡改

其他:

  • 种cookie的行为, 可由 "客户端持久化 + 每次请求带上数据" 来代替.
  • 客户端session 的一种标准: JWT. 只是数据格式不同, 流程上一致.
  • 客户端session 可能也叫 token, 或 token-based身份校验.
  • flask 默认使用客户端session
  • session 可存签发时间, 签发地点, 来丰富各类业务需要, 见 topics.

topics

session 持久化

服务端session → 保存到文件 / redis, 服务端重启后恢复session

客户端session → 持久化在客户端, 服务端不需额外处理

session 共享

实现:
不同服务端同步Session数据
不同服务端连接单点中心(获取Session)→ 集群的session管理, redis
保证用户访问同一个服务端

但都有缺陷:
同步数据增加性能开销
单点中心降低系统扩展性
如果用户上次访问的服务端需要维护怎么办

http://www.oschina.net/translate/using-secure-client-side-sessions-to-build-simple-and-scalable-node-js-applications

异地登录

客户端session仅能实现, 异地访问需重新登录的情况, 即情况2, 4:
客户端session存签发地点, 服务器校验时分析 当前请求的地址是否与签发地址一致

异地登录的4种情况
当变更地址登录时, 是否需要重新登录? 是否可以登录(是否在白名单地址, 如有)? 已登录是否会下线? 展开如下:

不需要重新登录 → 不需考虑异地登录的情况
需要重新登录

  • 不可以登录 → 禁止异地登录的情况
  • 可以登录
    • 会下线 → 1
    • 不会下线 → 2
    • 白名单决定是否可以登录, 会下线 → 3
    • 白名单决定是否可以登录, 不会下线 → 4

重复登录

客户端session无法禁止重复登录
服务端session → 用集群的session管理

单点登录

假设有2站:站A[已登录], 站B[未登录]

1. 同域关系

  1. 站A登录后,返回 tokenA,将其种在主域下
  2. 当访问站B时,检测请求是否有 tokenA,若有则执行下一步
  3. 发请求到站A验证 tokenA 有效性,若有则返回 sessionA 给 站B
  4. 站B查库将 sessionA -> tokenB,响应报文带上 tokenB
  5. 浏览器接收报文,种下 tokenB

2. 非同域关系

浏览器指纹
  • 通过浏览器指纹来识别是否同一个匿名用户
  • 站A提供: uuid -> tokenA?
  • 站A登录后,记录下 {uuid: tokenA} 关系
  • 访问站B时,domReady 生成finger -> tokenA? -> sessionB? -> tokenB? -> response
SSO 单点登录

@Td

3. 第三方登录

OAuth2

@Td

微信登录

@Td

ref

https://haofly.net/oauth-and-sso/
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
https://github.com/Valve/fingerprintjs

posted @ 2018-03-18 11:17  twlk28  阅读(197)  评论(0编辑  收藏  举报