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

现在还有用 cookies 吗

  •  
  •   pabno · 2020-07-22 12:14:49 +08:00 · 11353 次点击
    这是一个创建于 1586 天前的主题,其中的信息可能已经有所发展或是发生改变。

    接手公司的老项目,很多安全和身份相关的功能都是用 cookies 实现的。这玩意儿感觉既不好测试又不安全,以往都是使用 token 来做的身份安全相关

    不知道现在在 web 端主流是用 cookies 还是 token ?

    第 1 条附言  ·  2020-07-23 00:09:47 +08:00

    修正一下题目吧:现在前后端分离的新项目中做身份验证,是使用cookie+(session id/token),还是使用header+token比较流行

    抱歉,没经过大脑思考就提出这样的问题,没想到引起这么大的反应,先给各位大佬道个歉, 占用公共资源了

    提问方式确认有问题,这两个确实不能一概而论。一个是传输存储方式,一个是实现方案

    其实想表达的是,web开发中身份验证方式,是使用header 加个token 头的方式比较流行还是直接通过cookie+(session id / token)方式管理比较流行

    今天也被公司项目的cookie校验身份的一个bug整迷糊了(不是简单的校验cookie中的session id就可以了),以往都是直接对header 中的token就可以了。这种傻逼题目是在一脑子浆糊的情况下提出来的,见谅(已经跪下了)

    以往开发的项目,都是前后端分离的或者是面向app的,使用header+token的方式做身份校验。前端把token信息保存在localstorage中(今天了解过后才发现localstorage是不能跨域的,子域也不行,以往的前端也确实是spa, 所以当web是非spa应用时,应该就只能选cookie了)

    在我看来:

    使用cookie+(session id/token)

    优点:

    • 各种标准/代码库比较完善,浏览器支持也比较到位
    • 在加上了httpOnly和适当的跨域头等,保证安全方面机制比较完善,说不安全是我没经过大脑思考说出来的(一鞠躬),只是现在的项目在这两方面都有所欠缺

    缺点:

    • 只能在web中使用,如果终端包含了浏览器和客户端,客户端就又要实现一套身份校验逻辑(应该不会有人在app中请求http在header里加一个cookie 头吧)
    • 如果只是传输身份认证token信息(或者sessin id),传输量不是很大,没什么问题;但如果不加管理,往里面保存一些用户其他的信息,就容易导致cookie增大,每次传输的包体就会增大
    • 可能导致csrf,需要在页面中加入额外的随机数做处理,不过加入随机数校验处理后也能一定程度上解决防重放攻击
    • cookie中包含了key: value: age, domain, path;当key相同,domain不同,那可能导致一些血与泪的教训(躺过)

    使用header+token

    优点:

    • 如果终端包含了浏览器和客户端,校验逻辑可以统一,各端沟通成本降低
    • 由于身份信息保存在localstorage中,所以无需担心csrf
    • 调试成本底,http中有没有传Authorization头一眼看穿,你就算有多个也很容易看出来;cookie头通常包含很多信息,数据一多眼睛就晕(个人觉得)

    缺点:

    • 非spa应用无法使用(粗略认识)
    • 没有cookie+sessions id 来的直接粗暴

    至于xss,防范的手段还是在于网页的数据渲染上,只能靠过滤特殊字符实现,无论是localstorage还是cookie,只要注入了脚本,都是不安全的

    如果给我选:

    if spa {
        chose Authorization header
    }else {
        chose cookie(session id /token) + httpOnly + 随机数
    }
    

    希望技术问题就事论事

    104 条回复    2022-11-17 10:53:37 +08:00
    1  2  
    wakzz
        101
    wakzz  
       2020-07-23 22:27:24 +08:00
    至少从目前的规范趋势看,未来肯定是去 cookie 化的。虽然 cookie 目前有绝大多数浏览器和 app 的支持,但是由于 cookie 机制早期的设计问题,有太多安全隐患。在可见的未来几年,chrome 会率先默认禁用 cookie,届时在没有新的成熟方案前,前后端的 session 追踪只能依赖 token 实现。
    ochatokori
        102
    ochatokori  
       2020-07-23 23:23:54 +08:00
    @love #52 为什么不安全,有什么场景是只能取到 localstorage 里面的 token 取不到 cookie 里面的 token
    love
        103
    love  
       2020-07-24 08:30:55 +08:00
    @ochatokori 这不是前端安全基本操作吗,token cookie 要加上 httponly 标记,就不会被 js 取到,防止意外引入的 js 偷 token
    Lizhecao
        104
    Lizhecao  
       2022-11-17 10:53:37 +08:00
    看了一遍下来,感觉大佬们戾气好重,技术讨论而已,对事不对人。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:51 · PVG 01:51 · LAX 09:51 · JFK 12:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.