1、HTTP 为什么是无状态的
1、如果 HTTP 直接是有状态的,那么服务端需要跟踪每个客户端的状态信,所以无状态减轻服务器的负担,使其更加轻量级; 2、无状态使得服务器只专注于处理一个单独的请求,促使了客户端和服务器解耦; 3、为了使得HTTP可以适用于各种不同的应用场景,提高协议的可扩展性和灵活性。
2、服务器怎么设置cookie
服务端在 HTTP 响应头中添加一个 Set-Cookie 字段。
Cookie 还有一些常用的配置项,比如
domain、path、expires、httpOnly 等,这些配置项可以用来控制 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 信息,进而威胁网站安全。
防止方式: 设置 cookie的 httpOnly属性。
4、什么是Cookie劫持
通过中间人攻击,拦截用户的 Cookie,然后再次发送给服务端,这样就可以伪装成用户,从而获取用户的信息。
防止方式:
1、设置 cookie的 Secure属性,用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、网页授权流程有哪些步骤?
- 微信公众号需要引导用户进入授权页面同意授权获取code,微信小程序调用login获取code;
- 用户携带code请求服务器,服务器携带该code及额外标识(appid)等请求微信接口服务获取accessToken(也可以获取到refreshToken);
- 用户储存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。
19、一般来说SSO单点登录有什么缺陷
1、不论是颁发ticket各个系统颁发自己的token,或者颁发包含用户信息的token,都是使SSO系统失去对用户的管理,比如让某个用户下线; 2、若是让SSO系统维护登录信息,或者黑白名单,都会造成一定的内存消耗,特别是某个子系统用户量级高,则SSO系统也需要扩容。