V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lcqtdwj
V2EX  ›  程序员

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

  •  6
     
  •   lcqtdwj ·
    jiffies · 2014-11-22 00:20:40 +08:00 · 114993 次点击
    这是一个创建于 3440 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果只是与自己的服务器交互的话,APP的认证和Web的认证有什么区别呢?
    49 条回复    2017-11-30 17:12:33 +08:00
    fengchang
        1
    fengchang  
       2014-11-22 00:24:25 +08:00
    session是基于cookie的
    kslr
        2
    kslr  
       2014-11-22 00:26:10 +08:00
    cookie是由浏览器来接受处理的
    lcqtdwj
        3
    lcqtdwj  
    OP
       2014-11-22 00:40:24 +08:00
    @fengchang @kslr cookie只是在客户端存东西,APP不也要自己存token么。发送时候浏览器发送cookie,APP发送token。没什么区别感觉,为什么用两种机制呢?
    kslr
        4
    kslr  
       2014-11-22 00:58:18 +08:00
    @lcqtdwj 因为APP无法处理COOKIE,但token很适用这种设计。 简洁说就是新技术老技术,以前人们没想到,所以就没有设计这方面,人们就要再造个了。
    PrideChung
        5
    PrideChung  
       2014-11-22 01:06:02 +08:00
    app完全可以处理cookie,你说的token是指OAuth的accessToken和refreshToken么
    fengchang
        6
    fengchang  
       2014-11-22 01:21:56 +08:00
    @PrideChung 当然,只不过这么做没必要而已。只需要存一个字符串就可以解决的问题,为什么要去实现一套Cookie系统。
    Token就是一个令牌而已,不使用OAuth协议自己实现一个验证机制也没有问题
    LiangYuxuan
        7
    LiangYuxuan  
       2014-11-22 01:39:27 +08:00
    在APP下使用Token更加方便。
    而且考虑到授权传递的话,维护Cookie就同时麻烦了两边了。
    PrideChung
        8
    PrideChung  
       2014-11-22 01:40:54 +08:00
    @fengchang 干嘛要自己实现一套Cookie系统,iOS有NSURLConnection和NSURLSession天生就能处理Cookie,Android也肯定有类似的东西。
    vixvix
        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.
    SoloCompany
        10
    SoloCompany  
       2014-11-22 02:15:37 +08:00 via iPad
    session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
    sampeng
        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的中文名字就是令牌。。。。不是个多么高大上的东西
    sampeng
        12
    sampeng  
       2014-11-22 02:21:37 +08:00   ❤️ 1
    @SoloCompany 不要误导人,两者作用完全一样。key值而已。请先搞清楚session怎么工作的再说。。都扯到链路层了。。。。
    sampeng
        13
    sampeng  
       2014-11-22 02:22:33 +08:00
    扯了半天,要安全性。。唯https不可破。其他的,时间问题。。。只要你这个账号有被攻击的价值。。就跟裸奔没什么区别。
    mkeith
        14
    mkeith  
       2014-11-22 03:21:11 +08:00   ❤️ 1
    token和session不都是一个字符串?client凭这个这个字符串到服务器取数据,叫法不一样吧?
    mkeith
        15
    mkeith  
       2014-11-22 03:22:09 +08:00
    你把这个字符串存储在cookie里面就叫session了,放在url后面就叫token了.
    vibbow
        16
    vibbow  
       2014-11-22 06:32:29 +08:00
    @mkeith session也可以通过GET的方式传递。
    只不过默认是存在cookies里而已。
    wb14123
        17
    wb14123  
       2014-11-22 08:54:39 +08:00 via iPad
    token更简单易懂
    xujialiang
        18
    xujialiang  
       2014-11-22 09:29:15 +08:00
    好能扯啊你们。。。。快去补点基础知识吧。。。。
    akfish
        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
    SoloCompany
        20
    SoloCompany  
       2014-11-22 09:40:36 +08:00
    @sampeng 我怎么感觉你完全不知道 oauth token 是什么回事的,最好先去了解一下再谈怎样才是误导吧
    holmesabc
        21
    holmesabc  
       2014-11-22 09:49:15 +08:00
    akfish
        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的了一样。
    SoloCompany
        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也能保证基本的安全,数据包被监听后不能防止信息泄露,但可以防止信息伪造,包括重放攻击
    raincious
        24
    raincious  
       2014-11-22 10:24:36 +08:00 via Android
    @SoloCompany 分类分错了

    Authentication是Authentication,Session是Session。

    你上面分别说了两种验证方式和一种标记方式。
    SoloCompany
        25
    SoloCompany  
       2014-11-22 11:02:53 +08:00 via Android
    @raincious 严格说是这样的,但在实际场景中就是先认证建立session,然后之后的通讯是基于session来代替身份认证,广义来说也算是一种认证方式也没什么错,泄露了session cookie就基本上身份被盗取了
    Comdex
        26
    Comdex  
       2014-11-22 11:13:51 +08:00
    能弱弱地问一下大家token怎么设计生成,服务端应怎样处理么,新手求指导
    hcymk2
        27
    hcymk2  
       2014-11-22 11:37:12 +08:00
    session 这里是指http session吧。
    app 这服务器交互不一定只有http协议一条路吧。
    raincious
        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那样用。这完全取决于需求和决定。
    mcfog
        29
    mcfog  
       2014-11-22 12:05:27 +08:00
    session 和 token 就是个词而已…… 广义来说一切维护用户状态的技术都是session,一切动态生成的服务端有能力鉴别真假而本身无涵义的字符串都是token

    这注定是个鸡同鸭讲的主题,我都不知道我为啥要回复了
    crossmaya
        30
    crossmaya  
       2014-11-22 12:24:18 +08:00
    都是唯一值,有什么区别。。。。
    mkeith
        31
    mkeith  
       2014-11-22 12:45:24 +08:00
    @SoloCompany 这里的token和OAuth没什么关系吧?
    lcqtdwj
        32
    lcqtdwj  
    OP
       2014-11-22 13:16:24 +08:00
    @mcfog 新手比较糊涂嘛,我觉得道理是这么回事,能不能具体说说现在APP一般的auth流程实现,包括登陆状态的保持。
    msg7086
        33
    msg7086  
       2014-11-22 13:44:53 +08:00
    SessionId不就是Token……
    so898
        34
    so898  
       2014-11-22 14:04:10 +08:00
    iOS这边我倒是可以说说
    Cookie验证对于iOS来说很是繁琐的,比如说有些接口不需要验证,或者说就不能加上验证的,用Cookie的话也会自动发过去,需要手动清除Cookie,之后再添加;但是用Token就比较好控制发还是不发,毕竟是GET或者POST参数嘛
    再一个麻烦的就是Cookie在App关闭在开启之后会被重置,这个时候就需要做很多缓存的工作了,比较头疼,不如Token直接存在Keychain里面,每次要用的时候读取来的方便

    我默认楼主说的Session是储存在Cookie里面的,因为我只做过这种的……
    不过可能还是有理解误差……
    agassi_yzh
        35
    agassi_yzh  
       2014-11-22 14:07:11 +08:00
    现在很多Web App也是基于token了。参考jwt
    zhicheng
        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 ,用什么就无所谓了。
    mkeith
        37
    mkeith  
       2014-11-22 16:59:02 +08:00
    楼主这么纠结干什么呀,client端登陆后server端给个Identity,下次client去服务器取数据的时候带上这个Identity就是了.至于这个Identity放在哪儿,server能拿到就是了.
    lcqtdwj
        38
    lcqtdwj  
    OP
       2014-11-22 18:15:12 +08:00
    @mkeith 那么问题来了,我后台想要同时给web和app提供服务应该怎么办?
    GitFree
        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/
    wind4
        40
    wind4  
       2014-11-23 01:18:20 +08:00 via Android
    一个注重状态,一个注重授权。有什么问题吗?
    wind4
        41
    wind4  
       2014-11-23 01:24:14 +08:00 via Android
    Session表示的是会话状态,通过sessionid来确定客户端的身份,找回状态。
    Token注重授权,拿着这个token就可以享有特定的功能权限。
    至于安全性,非HTTPS有安全性可言吗?HTTPS就一定安全吗?
    wind4
        42
    wind4  
       2014-11-23 01:26:20 +08:00 via Android
    Session和Token都是有效期的,不过它们的生命周期不一样。
    xinyu198736
        43
    xinyu198736  
       2014-11-23 22:50:15 +08:00
    关键是大多数app啊的token啊 就是给每个用户生成一个字符串而已,顶多加上个过期时间什么的。感觉讨论偏离方向了。。。
    auth什么的,token只是其中的一个小概念而已。
    sampeng
        44
    sampeng  
       2014-11-24 18:37:12 +08:00
    @SoloCompany 一个是在get里,一个是在http header里。两个从本质上来说真没啥区别,token本身你可以做成超牛逼的加密一堆登陆的信息,也可以做成key.有兴趣可以去抓一下sina的登陆机制。很有意思。
    只要有闲情,session也做成和token一样的也没什么问题。

    不管是有效期,发送方式也好,从http本质来说,都只是字符串。是人为的赋予众多含义。把自己束缚在这些理论里的时间,还不如多解决点项目bug。难道说某些服务把sessionid的名字改了不叫seesion了。就不认识了?

    顶19搂,透过现象看本质。
    GentleSadness
        45
    GentleSadness  
       2016-09-19 10:54:36 +08:00 via Android
    @zhicheng 看了这么多,你的答案最靠谱


    简单来说,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。
    如果永远只是自己的网站,自己的 App ,用什么就无所谓了。
    HaoC12
        46
    HaoC12  
       2016-12-04 18:57:54 +08:00
    @zhicheng 后台想要同时给 web 和 app 提供服务应该怎么办?
    alian
        47
    alian  
       2017-04-26 18:14:28 +08:00
    @SoloCompany @zhicheng 同请教下,同时需要给 web 和 app 提供服务的 api 认证如何设计呢?感觉 token 用在 app 和服务器和服务器之间比较好,因为涉及加密。但是在 web 端就感觉不太现实了。还是同时用两套方案比较好呢, session 和 token ?
    xiaomeimei
        48
    xiaomeimei  
       2017-06-27 21:35:27 +08:00
    这个属于 HTTP 协议基础,不值得开贴吧!还有,楼上有很多是错误的理解!
    geeksun
        49
    geeksun  
       2017-11-30 17:12:33 +08:00
    APP 多数是面向 C 端用户的,使用 token 来识别每个 C 端用户比较方便。如果是 PC 端系统,使用 session 处理比较方便。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5360 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:14 · PVG 15:14 · LAX 00:14 · JFK 03:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.