Cookie、Token、JWT及单点登录

108 阅读6分钟

1、HTTP 为什么是无状态的

1、如果 HTTP 直接是有状态的,那么服务端需要跟踪每个客户端的状态信,所以无状态减轻服务器的负担,使其更加轻量级; 2、无状态使得服务器只专注于处理一个单独的请求,促使了客户端和服务器解耦; 3、为了使得HTTP可以适用于各种不同的应用场景,提高协议的可扩展性和灵活性

2、服务器怎么设置cookie

服务端在 HTTP 响应头中添加一个 Set-Cookie 字段。 响应Set-Cookie Cookie 还有一些常用的配置项,比如 domainpathexpireshttpOnly 等,这些配置项可以用来控制 Cookie 的作用域,以及 Cookie 的有效期。

  • domain:指定 Cookie 的作用域,默认是当前域名;
  • path:指定Cookie的默认路径,默认是请求的路径,如请求 http://localhost:8080/cookie_demo/path/son, 那么这个Cookie的默认路径就是/cookie_demo/path;
  • expires:指定 Cookie 的过期时间,默认是会话结束时过期;
  • httpOnly: 指定该 Cookie 是否只能通过 HTTP 协议来访问,默认false,可用来防止 XSS 攻击;
  • Secure: 指定 Cookie 是否只能通过 HTTPS 协议来传输,默认否。

3、什么是XSS攻击

攻击者将恶意脚本注入到网页中,从而获取 Cookie 信息,进而威胁网站安全。 防止方式: 设置 cookiehttpOnly属性。

4、什么是Cookie劫持

通过中间人攻击,拦截用户的 Cookie,然后再次发送给服务端,这样就可以伪装成用户,从而获取用户的信息。 防止方式: 1、设置 cookieSecure属性,用HTTPS协议加密传输; 2、限制Cookie的过期时间,缩短Cookie有效时间,减少Cookie劫持风险。

5、什么是Session登录

用户服务器发送请求时,服务器会为该客户端创建一个唯一的 SessionID,并在自己的内存中存储 Session 数据,并将SessionID设置为cookie。用户再次请求,会携带该 Session ID,服务端根据 Session ID 获取对应的 Session 数据以判断用户的会话状态。

6、怎么退出Session登录

服务器清除Session 中的登录状态即可。

7、cookie + session 有什么安全问题

1、cookie本身不安全,可以设置 Secure防止cookie劫持,设置httpOnly防止XSS攻击; 2、提交session复杂度并,防止被猜测或者重放攻击; 3、不要在URL中使用 session ID,避免会话固定攻击; 4、设置合理过期时间或者定期更换session ID,以保证会话安全性。

8、Session有什么缺点

1、Session 需要在服务端维护,需要找地方保存它,又要考虑分布式的问题,甚至要单独为了它启用一套 Redis 集群; 2、单点若登录使用 Session ,则各个子系统需要请求认证中心获取用户信息,如果某个系统体量大,则认证中心压力大,认证中心也需要扩容。

9、为什么使用JWT

将用户信息存在了JWT中,不需要再服务端保留会话信息。

10、JWT如何保证安全性

JWT 由三部分构成:header(头部)、payload(载荷)和 signature(签名)。每个部分用 . 做分隔

  • JWT Header:它是一个 JSON 对象,包含两个属性:alg(指定了用于生成签名的算法) 和 typ(用于表示令牌类型,通常为 “JWT”)
  • payload:包含实际信息的部分,通常是一个 JSON 对象,添加用户信息,但是不建议添加敏感信息,因为该部分可以被客户端解密。(JSON对象转为base64)
  • signature:由base64后的header、base64后的payload及secret私钥结合生成,用于签名用于验证消息在此过程中没有更改

11、JWT如何过期

1、在 payload 种设置过期时间,服务器可以解析该值判断是否过期,过期则拒绝该请求; 2、使用服务器白名单机制,在服务端维护一个数据标记哪些 token 是有效的,类似于session机制,该方法同样存在内存上的开销; 3、使用服务器黑名单机制,在服务端维护一个数据标记哪些 token 是无效的,由于过期的数量远远大于注销登录的数量,所以黑名单机制要比白名单机制消耗小。

12、如何实现无感刷新

使用refreshToken 刷新机制,当token失效时,使用refreshToken 刷新token

13、refreshToken存在客户端,如何保证refreshToken的安全性

可以通过绑定客户端 client_id 和 client_secret 来保证 refreshToken 的安全性,这样就可以保证 refreshToken 只能在特定的客户端使用。

14、什么是 OAuth 2.0

它是一种常见的认证和授权协议,如微信公众号授权。

15、网页授权流程有哪些步骤?

  1. 微信公众号需要引导用户进入授权页面同意授权获取code,微信小程序调用login获取code;
  2. 用户携带code请求服务器,服务器携带该code及额外标识(appid)等请求微信接口服务获取accessToken(也可以获取到refreshToken);
  3. 用户储存accessToken,请求时携带accessToken,服务器可以使用accessToken获取到用户信息。

16、为什么使用SSO单点登录

方便多个系统统一通过用户的一次性鉴别登录。减少各个系统登录产生的时间消耗,辅助了用户管理。

17、ticket 单点登录流程是什么

1、访问A系统,发现没有ticket,跳转到SSO系统; 2、SSO系统生成ticket,并使用户重定向到A系统并携带ticket; 3、用户携带ticket请求A系统,A系统向SSO系统发送请求验证ticket有效性; 4、ticket有效,A系统给用户一个token,方便用户后续登录; 5、访问B系统,发现没有ticket,跳转到SSO系统; 6、SSO系统发现已有ticket,重定向到B系统并携带ticket; 7、用户携带ticket请求B系统,B系统向SSO系统发送请求验证ticket有效性; 8、ticket有效,B系统给用户一个token,方便用户后续登录;

18、token 单点登录流程是什么

1、访问A系统,发现没有token,跳转到SSO系统; 2、SSO系统生成token和refreshToken,并使用户重定向到A系统并携带token和refreshToken; 3、用户携带token请求A系统,A系统向SSO系统交换一个密钥,解密token获取用户数据; 5、访问B系统携带token和refreshToken,B系统向SSO系统交换一个密钥,解密token获取用户数据; 6、当token失效时,使用refreshToken向SSO系统获取新的token。 2.png

19、一般来说SSO单点登录有什么缺陷

1、不论是颁发ticket各个系统颁发自己的token,或者颁发包含用户信息的token,都是使SSO系统失去对用户的管理,比如让某个用户下线; 2、若是让SSO系统维护登录信息,或者黑白名单,都会造成一定的内存消耗,特别是某个子系统用户量级高,则SSO系统也需要扩容。

引用

# 前端鉴权登录,你需要知道的一切。从 Cookie 到 JWT、从 Session 到 SSO

# 面试官:聊聊单点登录(SSO)