为什么 APP 要用 token 而不用 session 认证? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
lcqtdwj
V2EX    程序员

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

  •  6
     
  •   lcqtdwj
    jiffies 2014-11-22 00:20:40 +08:00 115808 次点击
    这是一个创建于 3997 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果只是与自己的服务器交互的话,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里面的,因为我只做过这种的……
    不过可能还是有理解误差……
    /div>
    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     Solana     906 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 19:50 PVG 03:50 LAX 12:50 JFK 15:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86