我想知道token和sessionid的区别是什么

2013-08-23 15:19:59 +08:00
 leonwong
我对token的概念其实是很模糊的,大概知道为了防止CSRF的攻击,服务器创建session时会随机生成一个token值,存入session中,然后网页前端请求的时候会附带token信息,服务器会做匹配,但是不清楚,这和sessionid的匹配有何区别?另外网页前端如何获取token呢?
43648 次点击
所在节点    程序员
42 条回复
zzNucker
2013-08-23 15:25:21 +08:00
form token的话一般会存在form元素里的
leonwong
2013-08-23 15:26:27 +08:00
@zzNucker 如果不用form提交,而是用js提交ajax参数,这样不需要token吗?
PrideChung
2013-08-23 15:41:03 +08:00
搞清楚CSRF攻击的原理就行了。session id能够标识一个用户,却无法知道该用户提交的表单是自愿主动提交的,还是被骗去点了个链接,被恶意的JS提交的,所以才需要CSRF token。
siw
2013-08-23 16:02:27 +08:00
sessionid 概念上就是一个 token 来的

无论是哪一个, 都用来识别来源请求
服务端和客户端产生链接就叫个session

而在网页HTTP的范围里, sessionid 就相当于cookies 来作为来源识别判断请求
每次浏览器request到服务器, 会自动传送 Cookies: xxx HTTP值
而Token 则是必须自己添加到请求, 无论是往 GET 还是POST

说错别喷
leonwong
2013-08-23 16:05:37 +08:00
@PrideChung 你这个解释很到位了已经
leonwong
2013-08-23 16:06:51 +08:00
@siw 你的解释我大概懂了,那么服务器该如何获取session中的token值呢?
leonwong
2013-08-23 16:07:58 +08:00
@PrideChung

@siw
我还想问的是客户端如何获取token值呢?不是服务器,说错了
siw
2013-08-23 16:12:13 +08:00
如果你在v2ex回复的时候, 看下原码里面有个叫
siw
2013-08-23 16:13:18 +08:00
如果你在v2ex回复的时候, 看下原码里面有个叫
<input type="hidden" name="once" value="">
那个 once 里的value 就是个token. 用firebug看看吧
leonwong
2013-08-23 16:18:05 +08:00
@siw 这个意思就是从服务器端取出token值存入隐藏域中吧,这应该是通过ajax实现的吧?但是我有一个疑问,这个取值是在用户登录之后一次性取值之后存在客户端,以后每次请求都会发送token值?还是说我每次请求都要取一次token,然后传token给服务端?
siw
2013-08-23 16:23:30 +08:00
V2ex 没有用ajax。。。
每次请求它就会给你新的token
leonwong
2013-08-23 17:10:53 +08:00
@siw 刚才我看了那个隐藏域中的值,我刷新后发现值没有发生改变,也就是说,刷新的时候并不是给隐藏域赋值的时机,那是通过什么方式,什么时机下给隐藏域赋值?
zzNucker
2013-08-23 17:22:16 +08:00
@leonwong 没关系 token并不是用来防止重复发帖的
理论上来说只要保证用户提交时会消耗掉一个token就行了

token由服务端产生 与session中的token值比对
leonwong
2013-08-23 17:43:17 +08:00
@zzNucker 原来是这样,那就是我每次请求完的时候,session中token值就开始变化,并且赋值给前端咯?
PrideChung
2013-08-23 18:46:52 +08:00
@leonwong 哪有这么复杂,连AJAX都出来了。服务器在生成表单的时候同时生成一个CSRF token,插入到表单的一个hidden field里面,并且把这个token记录在服务器端,通常是用户的Session数据里面。客户端啥都不用干,照常提交表单。当表单被提交的时候,服务端检查一个表单里面的token跟自己之前记录下来的是否匹配,匹配才继续处理。
undeadking
2013-08-23 19:03:17 +08:00
估计楼主是只前端,对服务端不怎么了解.下面是一个php库的token实现,其实很简单的.

http://flourishlib.com/docs/fRequest#PreventingCSRFSecurity
leonwong
2013-08-24 10:01:14 +08:00
@PrideChung
@undeadking
我是一个学生,还在学习中,因为我用的是纯静态页,不能范围取值,我能想到给表单赋值的方法只有ajax,我看了那个连接的内容,php一个范围取值就实现了hidden的赋值,的确很方便,如果我这种情况,改用动态页应该更合适吧
undeadking
2013-08-24 11:22:57 +08:00
@leonwong 防止CSRF这种东西是必须靠服务端来做的,纯静态页面压根就不存在被攻击的问题吧.

表单中的hidden字段是针对html的from表单提交来搞的.对于js和移动客户端来说,这种验证很麻烦,会导致进行操作之前还要先读一次html,所以API请求一般会直接在参数里面搞个token值来做验证,这就可能和session完全无关了
PrideChung
2013-08-24 19:01:41 +08:00
@leonwong 纯静态页的话,服务器根本就无法处理表单,还哪用防什么CSRF攻击。
daoluan
2013-08-24 19:51:58 +08:00
token 一般是做单点登录用,session 可能需要保存用户的信息。

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

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

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

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

© 2021 V2EX