cookies 登录的安全问题

2015-08-07 05:56:00 +08:00
 dxcqcv

网站希望改成后端只输出json,前端全部ajax请求的模式,也包括登录,那么问题来了

前端这块,用户登录后,登录信息只能保存在cookies里,到期清空,安全性实在是低,有什么好办法吗?

8792 次点击
所在节点    JavaScript
37 条回复
irainy
2015-08-07 11:06:37 +08:00
@jiaozi 现在不是流行全栈吗:D
Sight4
2015-08-07 11:48:39 +08:00
首先,cookie 与 session 是息息相关的,session的标识是通过 cookie 的固定 key获取,比如 session_id 或者 jsession_id 等等,现在很多框架都会帮你实现隐藏的 session 功能。但实际上,在标准的HTTP协议上,根本没有我们所谈论的 session,session 是基于 cookie 的一种HTTP状态维持实现(RFC2109)

其次,在很多精简的后端框架,压根是没有session这个东西,需要实现session,需要自己去写cookie,并且需要自己去序列化session信息保存,比如使用数据库,使用文件,使用缓存等等。而且写入cookie的key可以是你自己定义的任何值,比如 access_token、auth_token、abc或者任何你喜欢的

然后,最近我们做了一个项目,是完整的前后端分离,使用的方法是使用token验证,而且涉及到不同后端应用的反向代理,实现一个分布式的 session 不太现实,我们要求各后端应用的设计各自实现自己的类session状态维持,但实际上,这种设计是不合理的,http的优势反而是无状态。

最后,关于安全问题,除了增加无操作超时机制、多重验证的手段外,最能够防止 cookie 劫持的方法是使用 https。

希望以上信息对你有用。
CosWind
2015-08-07 13:36:27 +08:00
建议session用redis来做,后面做负载也不用考虑session共享的问题
CosWind
2015-08-07 13:38:01 +08:00
抱歉,没看清楚是网站,惯性以为是app的
br00k
2015-08-07 14:02:52 +08:00
session的数据是存放在服务端的,但是session ID是写在cookies的。
最简单提升安全度的方式自然是SSL,这样你的session ID就不会被人抓到了。
Amit
2015-08-07 15:19:57 +08:00
@Sight4
https可以防止cookie劫持,但是考虑极端一点,如果别人可以使用你的浏览器,把cookies记录下来,这样是可以伪造cookies进行登录的吧。如果session设置超时自动销毁还好,但是许多地方都有记住密码功能,用户状态是长期保存的,这样的网站如果伪造了cookies是可以一直保持登录的吧
freemind
2015-08-07 15:28:52 +08:00
大多数网站登录信息保存都和cookie相关,只是说看你登录信息如何保存了,自己想一套token验证机制用cookie实现还是比较安全的,遇到cookie劫持另说。 没有绝对安全的系统。
iyaozhen
2015-08-07 15:40:41 +08:00
首先 session 没有比 cookie 安全。

下面都是一般的情况,安全要一步步来嘛:

现在基本都是 ajax 做基本的前后端分离,用 session 的话和以前没什么区别(所有的接口验证 session)。session_id 通过 cookie 传递(httponly),你网页上的恶意脚本无法获取到 session_id,但抓包的话还是可以看见 session_id,这是时候 https 就登场了,在证书安全的情况下别人是无法获取你的 cookie 的(至于能获取到什么这个不清楚,求大神赐教)。

楼主你是要在 cookie 里面存什么登录信息呀?一般的做法是存一个加密后的 “token”,这个 token 是有时效性的,可以在服务端反解出用户id/用户名。其实和 session 机制类似,这样做的好处就是统一认证接口,各个端、各个产品线、各个开发语言都可以用。当然还是不能防止别人复制你的 token 干坏事,请搜索关键词:CSRF 攻击。

cookie、session 的问题至少还可以说 10 年,并不是一句“cookie 保存在客户端,session 保存在服务端”能解释清楚的。
allce231
2015-08-07 15:57:00 +08:00
登录注册都交给后台 cookie也是后台设置 httponly 退出登录都是交给后台清cookie
hupeng
2015-08-07 16:15:54 +08:00
@jiaozi 有个问题,你的session怎么和用户对应起来,不还是客户端的cookie中的某个值来找到对应的session?
outfocontrol
2015-08-07 17:01:04 +08:00
看有些回复似乎对 cookie 和 session 概念不是很清楚,我的理解是 session 和 cookie 根本是两个不同层次的概念,可很多文章非要把这两放在一起对比来说混淆读者。

cookie 是与 http 协议和浏览器实现标准相关的一部分,cookie 和 http 头部的其它http头字段差不多,而 session 是服务器维持用户状态的一种机制,它对于 http 协议和浏览器来说是透明的,它们并不知道 session 的存在。

由于http是无状态的,必须采取一种机制来追踪用户状态,session 的概念是这个,session 可以用不同的方式来实现,对 web 来说绝大部分情况都是用 cookie 来实现的,也有一些小众做法是在 url 上加 session id,或者在页面里加上个隐藏表单,session 实现的本质都是一样的,请求必须带上一个标识用户的信息,只不过在大部分情况下,这个信息都放在 cookie 中。
zonghua
2015-08-07 19:23:56 +08:00
一般情况下都是session要依靠cookie保持的,比如jsessionid的那个cookie,马德好多教材都不说明这个
janxin
2015-08-07 20:30:25 +08:00
可以看一下JSON Web Token这个解决方案
Sight4
2015-08-07 21:05:15 +08:00
@Amit 能使用你的浏览器已经属于社会工程的安全入侵问题,也不是服务端的设计能控制得来;无论session还是cookie还是token,在实际生产中都会控制超时,https只是提升安全系数,不是杜绝安全隐患。安全不是一方做得万无一失就高枕无忧,就好像,银行安全系数再高,被别人偷看了密码还是能把钱取出来是一个道理
OpooPages
2015-08-07 22:00:27 +08:00
jiaozi 是来赚@的,大家绕道! :)

如同 @breeswish 所说,大部分session是需要cookie支持的,这也是最方便的一种。
mornlight
2015-08-08 02:03:19 +08:00
你要这么想,淘宝、FaceBook、Google也还是用 Cookie 来保存用户状态...
ltttx
2015-08-10 08:59:31 +08:00
@sujin190 为什么没有区别?你是指都是通过客户端传递某一种信息(cookie或者token)来是识别用户吗? 你伪造的途径是什么?(通过破解用户密码?)不管怎么样用户都得通过用户密码登录,如果这些信息泄露了,不管用什么方式都在根本上解决不了这样的安全问题的。当然我们只能预防这种情况,比如提供密码复杂度,限制api访问频次 etc。采用 session(cookie)一般是基于浏览器的做法,采用token一般app用的比较多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/211392

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX