为什么 APP 要用 token 而不用 session 认证?

2014-11-22 00:20:40 +08:00
 lcqtdwj
如果只是与自己的服务器交互的话,APP的认证和Web的认证有什么区别呢?
115016 次点击
所在节点    程序员
49 条回复
fengchang
2014-11-22 00:24:25 +08:00
session是基于cookie的
kslr
2014-11-22 00:26:10 +08:00
cookie是由浏览器来接受处理的
lcqtdwj
2014-11-22 00:40:24 +08:00
@fengchang @kslr cookie只是在客户端存东西,APP不也要自己存token么。发送时候浏览器发送cookie,APP发送token。没什么区别感觉,为什么用两种机制呢?
kslr
2014-11-22 00:58:18 +08:00
@lcqtdwj 因为APP无法处理COOKIE,但token很适用这种设计。 简洁说就是新技术老技术,以前人们没想到,所以就没有设计这方面,人们就要再造个了。
PrideChung
2014-11-22 01:06:02 +08:00
app完全可以处理cookie,你说的token是指OAuth的accessToken和refreshToken么
fengchang
2014-11-22 01:21:56 +08:00
@PrideChung 当然,只不过这么做没必要而已。只需要存一个字符串就可以解决的问题,为什么要去实现一套Cookie系统。
Token就是一个令牌而已,不使用OAuth协议自己实现一个验证机制也没有问题
LiangYuxuan
2014-11-22 01:39:27 +08:00
在APP下使用Token更加方便。
而且考虑到授权传递的话,维护Cookie就同时麻烦了两边了。
PrideChung
2014-11-22 01:40:54 +08:00
@fengchang 干嘛要自己实现一套Cookie系统,iOS有NSURLConnection和NSURLSession天生就能处理Cookie,Android也肯定有类似的东西。
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.
SoloCompany
2014-11-22 02:15:37 +08:00
session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
sampeng
2014-11-22 02:19:34 +08:00
开发app就不需要知道http知识了?楼上9层,只有一层说到点子上了。
可以说10个人里面只有1个人知道http cookie是怎么回事么?

Android也有,http client有CookieStore接口,但重启应用就没了,如果需要高级一点,需要对SharePrefrense或者数据库之类的存储进行一下存储操作,当然,只需要实现接口,set进去即可。简单的很。
UrlConection也有类似的cookie。。。难道各位开发app的同学用框架了连补个cookie管理器都不知道怎么干?

上面是吐槽,说正经的,token机制是为了防止cookie被清除,另外cookie是会在所有域名请求都携带上,无意中增加了服务端的请求量,token只需要在有必要的时候携带。token的中文名字就是令牌。。。。不是个多么高大上的东西
sampeng
2014-11-22 02:21:37 +08:00
@SoloCompany 不要误导人,两者作用完全一样。key值而已。请先搞清楚session怎么工作的再说。。都扯到链路层了。。。。
sampeng
2014-11-22 02:22:33 +08:00
扯了半天,要安全性。。唯https不可破。其他的,时间问题。。。只要你这个账号有被攻击的价值。。就跟裸奔没什么区别。
mkeith
2014-11-22 03:21:11 +08:00
token和session不都是一个字符串?client凭这个这个字符串到服务器取数据,叫法不一样吧?
mkeith
2014-11-22 03:22:09 +08:00
你把这个字符串存储在cookie里面就叫session了,放在url后面就叫token了.
vibbow
2014-11-22 06:32:29 +08:00
@mkeith session也可以通过GET的方式传递。
只不过默认是存在cookies里而已。
wb14123
2014-11-22 08:54:39 +08:00
token更简单易懂
xujialiang
2014-11-22 09:29:15 +08:00
好能扯啊你们。。。。快去补点基础知识吧。。。。
akfish
2014-11-22 09:39:27 +08:00
好吧,这么基础的问题,居然还是没人说到点子上,最关键的一点是:
* 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
SoloCompany
2014-11-22 09:40:36 +08:00
@sampeng 我怎么感觉你完全不知道 oauth token 是什么回事的,最好先去了解一下再谈怎样才是误导吧

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

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

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

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

© 2021 V2EX