httpsession cookie 单点登录 顶域

在大部分时候,我们在讨论API的设计时,会从功能的角度出发定义出完善的、易用的API。而很多时候,非功能需求如安全需求则会在很晚才加入考虑。而往往这部分会涉及很多额外的工作量,比如与外部的SSO集成,Token机制等等。对该安全需求,一般有如下方案:

• 基于session的认证鉴权

• 基于token的认证鉴权

基于session

由于HTTP协议本身是无状态的,服务器需要某种机制来区分每个请求。比如在返回给客户端的响应中加入一些ID,客户端再次请求时带上这个ID,这样服务器就可以区分出来每个请求,并完成后续事务性的操作。在传统的Web容器中,这种机制通过Session来实现。Web容器会为每个首次请求创建一个Session,并将SessionID以浏览器Cookie的方式返回给客户端。客户端(常常是浏览器)在后续的请求中带上这个SessionID来表明自己的身份。这种机制同样被用在了鉴权方面,用户登录系统之后,系统分配一个SessionID给它。除非Session过期,或者用户从客户端的Cookie中主动删了SessionID,否则在服务器端看来,用户的信息会和这个Session绑定起来。后台系统也可以随时知道请求某个资源的真实用户是谁,并以此来判断该用户时候真的有权限这么做。

Session的问题及解决方案

这种做法在小规模应用中工作良好,但是随着用户的增多,企业往往需要部署多台服务器形成集群来对外提供服务。在集群模式下,当某个节点挂掉之后,由于Session默认是保存在部署Web容器中的,用户会被误判为未登录,后续的请求会被重定向到登陆页面,影响用户体验。这种将应用程序状态内置的方法已经完全无法满足应用的扩展,因此在工程实践中,我们会采用将Session外置的方式来解决这个问题。即集群中的所有节点都将Session保存在一个公用的键值数据库中。典型的做法就是使用spring session,将原来保存在各服务实例中的 Session 保存到实例共享的同一存储介质中。这样的话,无论请求访问到哪个服务实例,Session 均会对共享存储进行读写,从而达到 Session 共享的目的。目前常用Hazelcast和Redis作为存储session的介质,spring session官方文档对此有详细介绍:https://docs.spring.io/spring-session/docs/current/reference/html5/guides/hazelcast-spring.html和https://docs.spring.io/spring-session/docs/current/reference/html5/guides/security.html 采用外置的方式(比如Redis),Spring会拦截所有对HTTPSession对象的操作,后续的对Session的操作,Spring都会自动转换为与后台的Redis服务器的交互,从而避免节点挂掉之后Session丢失的问题。

基于token的认证鉴权

一般认为基于OAuth和JWT方案都是基于Token的,但OAuth对于不做开放平台的公司有些过于复杂。这里所说基于token的认证鉴权主要指JWT。
微信OAUTH2文章!!!!!!

微信2!!!!!!

下面简单以接入微博开放平台为例
在这里插入图片描述
微博回调地址 跳转回来会携带code
就是一个访问服务器的请求 我们只要在本地写一个controller就能将code获取

如果本次会话的session里没有当前这个loginuser的记录 说明没登陆过
在这里插入图片描述

一个域名下的不同微服务共享会话+一个微服务集群不同服务器共享会话

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面这个hash应该是sessionID
在这里插入图片描述
MapSession中持有HashMap类型的变量sessionAtts用于存储Session设置属性,比如调用的setAttribute方法的k-v就存储在该HashMap中。这个和tomcat内部实现HttpSession的方式类似,tomcat中使用了ConcurrentHashMap存储。

其中lastAccessedTime用于记录最近的一次访问时间,maxInactiveInterval用于记录Session的最大闲置时间(过期时间-针对没有Request活跃的情况下的最大时间,即相对于最近一次访问后的最大闲置时间)。
在这里插入图片描述
cookie name 为jsessionid value 为sessionid
请求到服务器时 根据value去查找具体的session
根据session去
https://www.cnblogs.com/lxyit/p/9672097.html

cookie是服务器发送回来的
在一个大业务下比如gulimall.com 是顶域 它下面的其他微服务 比如 auth.gulimall.com 是子域 即使cookie此时已经跨域 我们可以通过服务器代码设置让cookie 的domain 永远是在顶域的 这样就可以做到 访问这些网址的时候 cookie的jessionid名字都相同

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值