1
fengchang 2014-11-22 00:24:25 +08:00
session是基于cookie的
|
2
kslr 2014-11-22 00:26:10 +08:00
cookie是由浏览器来接受处理的
|
3
lcqtdwj OP |
4
kslr 2014-11-22 00:58:18 +08:00
@lcqtdwj 因为APP无法处理COOKIE,但token很适用这种设计。 简洁说就是新技术老技术,以前人们没想到,所以就没有设计这方面,人们就要再造个了。
|
5
PrideChung 2014-11-22 01:06:02 +08:00
app完全可以处理cookie,你说的token是指OAuth的accessToken和refreshToken么
|
6
fengchang 2014-11-22 01:21:56 +08:00
@PrideChung 当然,只不过这么做没必要而已。只需要存一个字符串就可以解决的问题,为什么要去实现一套Cookie系统。
Token就是一个令牌而已,不使用OAuth协议自己实现一个验证机制也没有问题 |
7
LiangYuxuan 2014-11-22 01:39:27 +08:00
在APP下使用Token更加方便。
而且考虑到授权传递的话,维护Cookie就同时麻烦了两边了。 |
8
PrideChung 2014-11-22 01:40:54 +08:00
@fengchang 干嘛要自己实现一套Cookie系统,iOS有NSURLConnection和NSURLSession天生就能处理Cookie,Android也肯定有类似的东西。
|
9
vixvix 2014-11-22 01:54:06 +08:00
App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session, 因此用session token来标示自己就够了,session/state由api server的逻辑处理。
如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session. 可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session. |
10
SoloCompany 2014-11-22 02:15:37 +08:00 via iPad
session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
|
11
sampeng 2014-11-22 02:19:34 +08:00 1
开发app就不需要知道http知识了?楼上9层,只有一层说到点子上了。
可以说10个人里面只有1个人知道http cookie是怎么回事么? Android也有,http client有CookieStore接口,但重启应用就没了,如果需要高级一点,需要对SharePrefrense或者数据库之类的存储进行一下存储操作,当然,只需要实现接口,set进去即可。简单的很。 UrlConection也有类似的cookie。。。难道各位开发app的同学用框架了连补个cookie管理器都不知道怎么干? 上面是吐槽,说正经的,token机制是为了防止cookie被清除,另外cookie是会在所有域名请求都携带上,无意中增加了服务端的请求量,token只需要在有必要的时候携带。token的中文名字就是令牌。。。。不是个多么高大上的东西 |
12
sampeng 2014-11-22 02:21:37 +08:00 1
@SoloCompany 不要误导人,两者作用完全一样。key值而已。请先搞清楚session怎么工作的再说。。都扯到链路层了。。。。
|
13
sampeng 2014-11-22 02:22:33 +08:00
扯了半天,要安全性。。唯https不可破。其他的,时间问题。。。只要你这个账号有被攻击的价值。。就跟裸奔没什么区别。
|
14
mkeith 2014-11-22 03:21:11 +08:00 1
token和session不都是一个字符串?client凭这个这个字符串到服务器取数据,叫法不一样吧?
|
15
mkeith 2014-11-22 03:22:09 +08:00
你把这个字符串存储在cookie里面就叫session了,放在url后面就叫token了.
|
17
wb14123 2014-11-22 08:54:39 +08:00 via iPad
token更简单易懂
|
18
xujialiang 2014-11-22 09:29:15 +08:00
好能扯啊你们。。。。快去补点基础知识吧。。。。
|
19
akfish 2014-11-22 09:39:27 +08:00 10
好吧,这么基础的问题,居然还是没人说到点子上,最关键的一点是:
* Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端 其它细枝末节的区别,全部是由这一点造成的。 就没人想过为什么token-based的authentication需要一堆secret key来干嘛么? 因为状态信息全部是放在客户端,为了避免被篡改,于是需要用密码学的方法来签名/加密。 可以自己去这里玩玩JWT的Debugger: http://jwt.io/ 一进去你就会注意到两点: 1. Token解码后就包含所有登陆信息 2. Token你随便改一位都会提示无效 更多的详见: http://www.slideshare.net/derekperkins/authentication-cookies-vs-jwts-and-why-youre-doing-it-wrong |
20
SoloCompany 2014-11-22 09:40:36 +08:00
@sampeng 我怎么感觉你完全不知道 oauth token 是什么回事的,最好先去了解一下再谈怎样才是误导吧
|
21
holmesabc 2014-11-22 09:49:15 +08:00
@SoloCompany
+1 |
22
akfish 2014-11-22 09:51:50 +08:00
如果lz说的是OAuth Token的话,这货在本质上还是session identifier,那么和普通session id的区别也就只是获得这个token的过程不同。
ls有人说什么token需要才传,不需要不传,那session id不是么?说得好像用了OAuth,HTTP就不是stateless的了一样。 |
23
SoloCompany 2014-11-22 09:59:01 +08:00
可以对比一下三种认证方式的区别,这也是很基础的事情了
1. basic auth 没有安全性可言,完全依赖 https,并且每次请求都需要传递密码,是最不安全的 2. session 一般需要 basic auth 或其它 auth 方式先进行身份认证后才能建立,和 basic auth 一样没有什么安全性可言,需要 https 保障,只不过避免了每次传递密码(忽略服务器端状态这点特性) 3. oauth 部分是为了解决 basic auth 的安全问题而设计的,但是要复杂很多,即使没有https也能保证基本的安全,数据包被监听后不能防止信息泄露,但可以防止信息伪造,包括重放攻击 |
24
raincious 2014-11-22 10:24:36 +08:00 via Android
|
25
SoloCompany 2014-11-22 11:02:53 +08:00 via Android
@raincious 严格说是这样的,但在实际场景中就是先认证建立session,然后之后的通讯是基于session来代替身份认证,广义来说也算是一种认证方式也没什么错,泄露了session cookie就基本上身份被盗取了
|
26
Comdex 2014-11-22 11:13:51 +08:00
能弱弱地问一下大家token怎么设计生成,服务端应怎样处理么,新手求指导
|
27
hcymk2 2014-11-22 11:37:12 +08:00
session 这里是指http session吧。
app 这服务器交互不一定只有http协议一条路吧。 |
28
raincious 2014-11-22 11:42:46 +08:00 1
@SoloCompany
其实你这样理解是将“用户登录系统”看成一个整体了。但事实上“用户登录系统”可以是由Auth + Session组成的。 Auth的方式比如OAuth和Basic Auth甚至Get参数Auth诸如此类。但是Auth系统在Auth过程之后就完成操作了,剩下的继续由“用户登录系统”交给Session或者Token来实现用户绑定。 比如: https://gist.github.com/raincious/2820fd0b85511adc3ef2 注意Session可以不需要验证用户是否合法,它只需要查询自身数据(SessionID之类)是否合法,因为它用到的用户数据本身就(应当)是来自程序的运算结果,可以看作是信任数据。 事实上TokenID也可以看做SessionID,但是这完全取决于你如何实现你的系统。现在好像没有一个统一的规范说“Token”这个词必须用在某种格式的数据上。于是乎你可以拿Token放在Json里当SessionID用(相当于从HTTP Header里换到了HTTP Body里),也可以像@akfish提到的JWT那样用。这完全取决于需求和决定。 |
29
mcfog 2014-11-22 12:05:27 +08:00
session 和 token 就是个词而已…… 广义来说一切维护用户状态的技术都是session,一切动态生成的服务端有能力鉴别真假而本身无涵义的字符串都是token
这注定是个鸡同鸭讲的主题,我都不知道我为啥要回复了 |
30
crossmaya 2014-11-22 12:24:18 +08:00
都是唯一值,有什么区别。。。。
|
31
mkeith 2014-11-22 12:45:24 +08:00
@SoloCompany 这里的token和OAuth没什么关系吧?
|
32
lcqtdwj OP @mcfog 新手比较糊涂嘛,我觉得道理是这么回事,能不能具体说说现在APP一般的auth流程实现,包括登陆状态的保持。
|
33
msg7086 2014-11-22 13:44:53 +08:00
SessionId不就是Token……
|
34
so898 2014-11-22 14:04:10 +08:00
iOS这边我倒是可以说说
Cookie验证对于iOS来说很是繁琐的,比如说有些接口不需要验证,或者说就不能加上验证的,用Cookie的话也会自动发过去,需要手动清除Cookie,之后再添加;但是用Token就比较好控制发还是不发,毕竟是GET或者POST参数嘛 再一个麻烦的就是Cookie在App关闭在开启之后会被重置,这个时候就需要做很多缓存的工作了,比较头疼,不如Token直接存在Keychain里面,每次要用的时候读取来的方便 我默认楼主说的Session是储存在Cookie里面的,因为我只做过这种的…… 不过可能还是有理解误差…… |
35
agassi_yzh 2014-11-22 14:07:11 +08:00
现在很多Web App也是基于token了。参考jwt
|
36
zhicheng 2014-11-22 15:24:08 +08:00 3
Session 是一种HTTP存储机制,目的是为无状态的HTTP提供的持久机制。所谓 Session 认证只是简单的把 User 信息存储到 Session 里,因为 SID 的不可预测性,暂且认为是安全的。这是一种认证手段。
而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让 某App 有权利访问 某用户 的信息。这里的 Token 是唯一的。不可以转移到其它 App 上,也不可以转到其它 用户 上。 转过来说 Session 。Session 只提供一种简单的认证,即有此 SID ,即认为有此 User 的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方App。 所以简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。 如果永远只是自己的网站,自己的 App ,用什么就无所谓了。 |
37
mkeith 2014-11-22 16:59:02 +08:00
楼主这么纠结干什么呀,client端登陆后server端给个Identity,下次client去服务器取数据的时候带上这个Identity就是了.至于这个Identity放在哪儿,server能拿到就是了.
|
39
GitFree 2014-11-23 00:13:47 +08:00 via Android
顶36楼,另附一篇对比session和token的文章https://auth0.com/blog/2014/01/27/ten-things-you-should-know-about-tokens-and-cookies/
|
40
wind4 2014-11-23 01:18:20 +08:00 via Android
一个注重状态,一个注重授权。有什么问题吗?
|
41
wind4 2014-11-23 01:24:14 +08:00 via Android
Session表示的是会话状态,通过sessionid来确定客户端的身份,找回状态。
Token注重授权,拿着这个token就可以享有特定的功能权限。 至于安全性,非HTTPS有安全性可言吗?HTTPS就一定安全吗? |
42
wind4 2014-11-23 01:26:20 +08:00 via Android
Session和Token都是有效期的,不过它们的生命周期不一样。
|
43
xinyu198736 2014-11-23 22:50:15 +08:00
关键是大多数app啊的token啊 就是给每个用户生成一个字符串而已,顶多加上个过期时间什么的。感觉讨论偏离方向了。。。
auth什么的,token只是其中的一个小概念而已。 |
44
sampeng 2014-11-24 18:37:12 +08:00
@SoloCompany 一个是在get里,一个是在http header里。两个从本质上来说真没啥区别,token本身你可以做成超牛逼的加密一堆登陆的信息,也可以做成key.有兴趣可以去抓一下sina的登陆机制。很有意思。
只要有闲情,session也做成和token一样的也没什么问题。 不管是有效期,发送方式也好,从http本质来说,都只是字符串。是人为的赋予众多含义。把自己束缚在这些理论里的时间,还不如多解决点项目bug。难道说某些服务把sessionid的名字改了不叫seesion了。就不认识了? 顶19搂,透过现象看本质。 |
45
GentleSadness 2016-09-19 10:54:36 +08:00 via Android
@zhicheng 看了这么多,你的答案最靠谱
简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。 如果永远只是自己的网站,自己的 App ,用什么就无所谓了。 |
47
alian 2017-04-26 18:14:28 +08:00
@SoloCompany @zhicheng 同请教下,同时需要给 web 和 app 提供服务的 api 认证如何设计呢?感觉 token 用在 app 和服务器和服务器之间比较好,因为涉及加密。但是在 web 端就感觉不太现实了。还是同时用两套方案比较好呢, session 和 token ?
|
48
xiaomeimei 2017-06-27 21:35:27 +08:00
这个属于 HTTP 协议基础,不值得开贴吧!还有,楼上有很多是错误的理解!
|
49
geeksun 2017-11-30 17:12:33 +08:00
APP 多数是面向 C 端用户的,使用 token 来识别每个 C 端用户比较方便。如果是 PC 端系统,使用 session 处理比较方便。
|