分布式session共享解决什么问题

taobao 分布式session处理方式 - 企业应用 - Java - ITeye论坛
taobao 分布式session处理方式
& 上一页 1
锁定老帖子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
来自: 合肥
发表时间:&&
最后修改:
相关知识库:
之前淘宝员工分享过淘宝分布式session处理方式,如下:
很好奇怎么实现和保证安全的?冒着删帖的可能。
cookie除了sessionsid以外,需要其他cookie key,存放用户登录信息,当用户在A机器登录时,如果下次访问路由到B机器,需要从cookie key中获取信息,判断用户是否已经登录和登录时间过期,如果没有,直接初始化session。
应该是这样的过程,不过也要保证用户访问尽量访问同一台机器。如果随机的访问任何一台机子,在集群中几台、几十台、或者上百台服务器,生存的session太多了。但这样不能保证每台机器的压力是均衡的,如果考虑session集成存储,现在比较好的方案就是nosql存储,修改tomcat、jetty和jboss等session的存储方式是很容易的,
来自: 北京
发表时间:&&
对cookie做加密啊
请登录后投票
等级: 初级会员
来自: 合肥
发表时间:&&
可水平扩展的,有状态变为无状态还是很cool的,或许html5普及了,会有更好的解决方案
请登录后投票
来自: 苏州
发表时间:&&
我很怀疑楼主说的是否真是淘宝解决后台无状态化的方法!后台无状态化的关键是在web容器存储session的Map中有一系列cookie串值作为key的对象。以便于前台client提交请求后,通过隐藏发过来的client的cookie值来标识此client的身份('已经登录'或标识和前面的访问信息的关联性,放在map的value中)。所以说无论这些‘关联信息’是放在Map的value中还是每次都和cookie一起传过来,web容器必须存储此cookie值!而当用户在不同的集群server中切换时一样会存在另一个server中并没有此sessiion的cookie值。从而提示'未登陆'或其他!
请登录后投票
来自: 苏州
发表时间:&&
如果仅仅是在对cookie进行特殊加密的话,相当于自己实现了一套后台的session机制。
如果加密强度不够的话,如何解决安全性问题?如果加密强度太高的话,如何解决效率问题?
方便的话,楼主是否能贴出淘宝所说的这种解决方式的出处,或提供更详细的信息!
请登录后投票
jinnianshilongnian
文章: 1113
积分: 2290
发表时间:&&
最后修改:
melin 写道之前淘宝员工分享过淘宝分布式session处理方式,如下:
很好奇怎么实现和保证安全的?冒着删帖的可能。
刚才通过火狐插件 Tamper Data试了一下
&& 首先在chrome登录成功 获取 下的所有cookie
&& 接下来到firefox 登录我的淘宝& 通过 Tamper Data修改cookie& 我的淘宝能显示出来(但页头的信息不显示[估计有哪个地没把cookie加上 还是其他问题]),如图
1、其实淘宝的登录/支付 都是 走https 而且都是需要密码的,这块还是安全的
2、如果用session同样也是不安全的啊,只要获取JESSIONID也可以模拟(还是通过cookie来实现)啊
个人拙见 望指正
&&
请登录后投票
文章: 3527
积分: 1500
来自: 中华大丈夫学院
发表时间:&&
@melin,@chenxu,一个可行方案时:client使用cookie中存放关键的几个数据或临时token等作为key,server使用分布式缓存作为伪session数据内容的管理容器。
请登录后投票
等级: 初级会员
来自: 上海
发表时间:&&
kimmking 写道@melin,@chenxu,一个可行方案时:
client使用cookie中存放关键的几个数据或临时token等作为key,
server使用分布式缓存作为伪session数据内容的管理容器。
这是终极解决方案,也是最安全的解决方案。
用cookie标识用户登录,但如果缓存中没有sessionId,那么会跳转到登录界面,要求用户再登录一次,这也是为了确保用户后台安全。
除了taobao以外,像京东之类也都是这么做的吧。
请登录后投票
joy2everyone
发表时间:&&
最后修改:
我知道的一种处理方式是:服务器端提供类似cookie_secret选项(可以是任意的字符串、随机数,即安全密码),采取HMAC,将cookie_secret作为key,然后结合cookie的key,value和当前时间戳进行加密,客户端获得到加密处理的cookie值,
set_secure_cookie('name', 'test')
浏览器将获得key为name的加密cookie
Set-Cookie name=dGVzdA==||c205a84ecdf48b523d6a8fa8d1630; expires=Tue, 03 Apr :43 GMT; Path=/
'dGVzdA==': 是'test'base64格式后内容
'': 时间戳
'c205a84ecdf48b523d6a8fa8d1630': 安全签名
下次再请求的时候,服务器对这个加密后的安全cookie进行分析,用该cookie的key('name'),value('dGVzdA==')和时间戳('')结合服务器中定义的cookie_secret,来生成期望中的签名,将此签名和客户端的签名进行比较,即可完成安全验证。
1.进行加密的代码片段,类似代码的python实现:
# -*- coding: utf-8 -*-
import hmac
import hashlib
import base64
hash = hmac.new("3faa4efbf81f1ce9e0fa", digestmod=hashlib.sha1)
s = base64.b64encode('test')
for part in ['name', s, '']:
hash.update(part)
print hash.hexdigest()
# 3faa4efbf81f1ce9e0fa 是cookie_secret
# c205a84ecdf48b523d6a8fa8d1630 是加密后的签名
2. 进行比较的时候可以使用位运算(按位或和按位异或),可提高效率,类似代码的python实现:
def _is_invalid_signature(signature1, signature2):
if len(signature1) != len(signature2):
return False
result = 0
for x, y in zip(signature1, signature2):
result |= ord(x) ^ ord(y)
return result == 0
3. 由于cookie_secret是定义在服务器端的安全密码,一般情况下,客户端是无法知道的,从而用来实现session secure cookie
请登录后投票
jinnianshilongnian
文章: 1113
积分: 2290
发表时间:&&
joy2everyone 写道我知道的一种处理方式是:服务器端提供类似cookie_secret选项(可以是任意的字符串、随机数,即安全密码),采取HMAC,将cookie_secret作为key,然后结合cookie的key,value和当前时间戳进行加密,客户端获得到加密处理的cookie值,
set_cookie('name', 'test')
浏览器将获得key为name的加密cookie
Set-Cookie name=dGVzdA==||c205a84ecdf48b523d6a8fa8d1630; expires=Tue, 03 Apr :43 GMT; Path=/
'dGVzdA==': 是'test'base64格式后内容
'': 时间戳
'c205a84ecdf48b523d6a8fa8d1630': 安全签名
下次再请求的时候,服务器对这个加密后的安全cookie进行分析,用该cookie的key('name'),value('dGVzdA==')和时间戳('')结合服务器中定义的cookie_secret,来生成期望中的签名,将此签名和客户端的签名进行比较,即可完成安全验证。
1.进行加密的代码片段,python2.*代码:
# -*- coding: utf-8 -*-
import hmac
import hashlib
import base64
hash = hmac.new("3faa4efbf81f1ce9e0fa", digestmod=hashlib.sha1)
s = base64.b64encode('test')
for part in ['name', s, '']:
&&& hash.update(part)
print hash.hexdigest()
# 3faa4efbf81f1ce9e0fa 是cookie_secret
# c205a84ecdf48b523d6a8fa8d1630 是加密后的签名
2. 进行比较的时候可以使用位运算(按位或和按位异或),可提供效率,类似的python2.*代码:
def check(signature1, signature2):
&&& if len(signature1) != len(signature2):
&&&&&&& return False
&&& result = 0&&&&&&&
&&& for x, y in zip(signature1, signature2):
&&&&&&&&&&& result |= ord(x) ^ ord(y)
&&& return result == 0
3. 由于cookie_secret是定义在服务器端的安全密码,一般情况下,客户端是无法知道的,从而用来实现session secure cookie。
我只要拦截了 就是不安全的,只要客户端能看到的,不是走的https 都是不安全的
请登录后投票
& 上一页 1
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术关于使用Redis做分布式session管理9 months ago24收藏分享举报{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[],&title&:&关于使用Redis做分布式session管理&,&author&:&kevin-33-97&,&content&:&\u003Cp\u003E当项目使用分布式时,session问题就显得比较突出了,因为有不同服务器的缘故,如果你安照一般方式存储session,那么你的session会保存在某一台服务器上,如果你的下一个请求并不是访问这台服务器,那么会发生读取不到session的情况。这种情况的解决方案有许多种,例如你可以采用session sticky的方式,但是这样会对负载均衡器造成相当大的负担,而且某台服务器挂了,会造成session丢失。或者采用session replication方式,但是如果服务器数量一多,是不是就造成了十分庞大的带宽开销,而且,如果有很多客户端同时访问服务器的话,那么每台服务器都需要保存大数量的session数据,而session数据是存储在内存中的,这样每台机器用于保存session数据占用的内存就太多了。还有一种就是采用cookie,不过这种方式是十分不可取了,先不说session数据放到客户端那边造成的安全问题,这样会造成带宽消耗,而且会强烈影响性能,而且cookie自身也有长度限制。而另外一种方式则是session 集中化处理,你可以存在数据库中,也可以采用其他分布式存储系统,这里session的储存引入了网络操作,所以可能会有数据延迟,而且当session储存设备挂了,会造成所有session丢失,不过总体来说,这种session的存储方式是十分明显的。而这里我们采用redis,nosql的方式进行session存储。\u003C\u002Fp\u003E而使用redis存储的实现方案有好多种,这里介绍一下。\u003Cbr\u003E\u003Cul\u003E\u003Cli\u003E第一种是使用容器拓展来实现,一般都是通过容器插件来实现,例如基于Tomcat的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002Fjcoleman\u002Ftomcat-redis-session-manager\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Etomcat-redis-session-manager\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E,基于Jetty的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002FOvea\u002Fjetty-session-redis\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003Ejetty-session-redis\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E等等。好处是对项目来说是透明的,无需更改代码,但是目前还不支持Tomcat8。个人觉得由于过于依赖容器,,一旦更换容器或者容器升级,那又得重新来过。而且代码并不在项目中,对于开发者的维护也是个麻烦。\u003C\u002Fli\u003E\u003Cli\u003E第二种是自定义会话管理的工具类,这样的话灵活性很大,可以根据自身需求来实现,但是需要额外的开发时间\u003C\u002Fli\u003E\u003Cli\u003E第三种是使用框架的会话管理工具,例如spring-session,shiro等,可以理解是替换了servlet那一套会话管理,不依赖容器,不用改动代码。如果采用spring-session的话,使用的是spring-data-redis那一套连接池,prefect,不过前提是你得用spring框架。至于shiro,那是一个十分成熟,强大易用的安全框架,学习成本比spring-session来的要多一些。\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E在下篇文章中,将写一下使用容器拓展实现redis session存储...\u003C\u002Fp\u003E&,&updated&:new Date(&T09:45:20.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:15,&collapsedCount&:0,&likeCount&:24,&state&:&published&,&isLiked&:false,&slug&:&&,&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002Fv2-c940f0e2c05a7c619ac8698_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Java Web&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Java&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&Java 程序员&}],&adminClosedComment&:false,&titleImageSize&:{&width&:597,&height&:551},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&tipjarState&:&closed&,&annotationAction&:[],&sourceUrl&:&&,&pageCommentsCount&:15,&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T17:45:20+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:null,&isFollowing&:false,&hash&:&d29e010a3ed1d9ae24e85d&,&uid&:669760,&isOrg&:false,&slug&:&dang-sheng-10&,&isFollowed&:false,&description&:&&,&name&:&党生&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdang-sheng-10&,&avatar&:{&id&:&v2-0fc9c54fc822a31303eaa24&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&程序员&,&isFollowing&:false,&hash&:&d0ac5beae356c4ba1eabb4&,&uid&:759400,&isOrg&:false,&slug&:&originaladam&,&isFollowed&:false,&description&:&&,&name&:&OriginalAdam&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Foriginaladam&,&avatar&:{&id&:&0b57ad04a7e1030ccf4e001fcda7a3e0&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&素数&,&isFollowing&:false,&hash&:&24a4dff91e609b4f8c3d5&,&uid&:24,&isOrg&:false,&slug&:&zhao-zhong-90-51&,&isFollowed&:false,&description&:&&,&name&:&赵中&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhao-zhong-90-51&,&avatar&:{&id&:&d9d67701e&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&通过计算机控制挖掘机炒菜。。。。&,&isFollowing&:false,&hash&:&427ea4f09ddcd804d06a28&,&uid&:733200,&isOrg&:false,&slug&:&dugking&,&isFollowed&:false,&description&:&“我天性不宜交际。在多数场合,我不是觉得对方乏味,就是害怕对方觉得我乏味。可是我既不愿忍受对方的乏味,也不愿费劲使自己显得有趣,那都太累了。我独处时最轻松,因为我不觉得自己乏味,即使乏味,也自己承受,不累及他人,无需感到不安。” —— 周国平&,&name&:&杜king&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdugking&,&avatar&:{&id&:&v2-2cdc108e7fd5b231edf6fb9d650aaf69&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&想当厨师的程序猿&,&isFollowing&:false,&hash&:&74c5e82dbc&,&uid&:429200,&isOrg&:false,&slug&:&xu-shi-chao-36-43&,&isFollowed&:false,&description&:&&,&name&:&徐世超&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fxu-shi-chao-36-43&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&当项目使用分布式时,session问题就显得比较突出了,因为有不同服务器的缘故,如果你安照一般方式存储session,那么你的session会保存在某一台服务器上,如果你的下一个请求并不是访问这台服务器,那么会发生读取不到session的情况。这种情况的解决方案有许…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&annotationDetail&:null,&commentsCount&:15,&likesCount&:24,&FULLINFO&:true}},&User&:{&kevin-33-97&:{&isFollowed&:false,&name&:&Kevin&,&headline&:&本人是一个在深圳做Java的苦逼程序猿&,&avatarUrl&:&https:\u002F\\u002F50\u002Fv2-2018a1fdbe21a0dc8cf253_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&kevin-33-97&,&bio&:&一个做Java的苦逼程序猿&,&hash&:&d648b50cff&,&uid&:477400,&isOrg&:false,&description&:&本人是一个在深圳做Java的苦逼程序猿&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fkevin-33-97&,&avatar&:{&id&:&v2-2018a1fdbe21a0dc8cf253&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&androidPassThroughPush&:&all&,&newMore&:&new&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&liveStore&:&ls_a2_b2_c1_f2&,&searchHybridTabs&:&pin-3&,&isOffice&:&false&,&homeUi2&:&default&,&remixOneKeyPlayButton&:&headerButton&,&marketTab&:&market_tab_old&,&qrcodeLogin&:&qrcode&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&androidDbRecommendAction&:&open&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&default&:&None&,&wechatShareModal&:&wechat_share_modal_show&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&default&}},&columns&:{&next&:{}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}使用Spring Session做分布式会话管理
2017年十一月
12131415161718
19202122232425
2627282930
Categories
loving Freedom + + loving Linux
北京师范大学脑与认知科学学院的硕士研究生
一枚伪Geek,爱折腾,会捣鼓OS X和Linux
Live for art’s sake
前端仔 拍照人 运动爱好者
关心粮食和蔬菜 关心事实与真相97被浏览16605分享邀请回答0添加评论分享收藏感谢收起2添加评论分享收藏感谢收起查看更多回答}

我要回帖

更多关于 session 跨域问题解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信