手機應用開發:token、cookie的區別


cookie最初是解决http连接无状态问题的产物,用于客户端和服务端共同维护一些状态数据。

cookie会被附加到http请求中,这不需要开发者做额外的支持。cookie存在一个最大长度的问题(4KB?)。

token通常作为验证后的凭证,免除在一定时间内的重复验证。

token的存储和参数传递都需要开发者来处理。

使用cookie来维持登录态,在实现过程中实际上是在cookie中添加一个token来维持一个登录态。

cookie和token都是一个字符串,具体在这个字符串里面存放什么都可以商量。

一般做法是这样的: 这里只讨论登录名和密码,不考虑设备id等其他一些参数。
客户端 登录请求参数:account,md5(password+salt)
服务端验证后 返回:result,token

md5(password+salt)的目的不在于抵御重放攻击,而是为了保护用户真正的密码不被泄露。

md5以及其他摘要算法(sha1、sha256等)并不属于加密算法。

如果希望整个通信不是明文传输,可以使用HTTPS,或者自己实现一套服务器认证,公钥交换以及加密解密的规则。

走 https 了,還需要對參數加密以防止重放攻擊嗎?
https://www.oschina.net/question/1047640_2180952
=> 走https之后,记得不要url后跟参数,因为会被浏览器,路由器记到历史记录里。不要用cookie存明文。其他的应该无所谓了。关键是app这边加密并没有用啊,因为别人可以看到你源码的。app加密,服务器解密,这样可以防止信息泄漏。服务器加密,app解密,这个没用,你源码都在别人手里了


抵御重放攻击,可以在请求中加入时间戳,对整个请求体做签名,服务器验签后检查时间戳以及account,来决定是否响应。
https://baike.baidu.com/item/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB

(1)加随机数。该方法优点是认证双方不需要时间同步,双方记住使用过的随机数,如发现报文中有以前使用过的随机数,就认为是重放攻击。缺点是需要额外保存使用过的随机数,若记录的时间段较长,则保存和查询的开销较大。

(2)加时间戳。该方法优点是不用额外保存其他信息。缺点是认证双方需要准确的时间同步,同步越好,受攻击的可能性就越小。但当系统很庞大,跨越的区域较广时,要做到精确的时间同步并不是很容易。

(3)加流水号。就是双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。该方法优点是不需要时间同步,保存的信息量比随机数方式小。缺点是一旦攻击者对报文解密成功,就可以获得流水号,从而每次将流水号递增欺骗认证端。

在实际中,常将方法(1)和方法(2)组合使用,这样就只需保存某个很短时间段内的所有随机数,而且时间戳的同步也不需要太精确。


登录后实际上就是授权票据的传输,票据通常就是一个或多个字符串,被称为token,你可以把它放到cookie里面,也可以跟在参数上,那这两种有什么区别呢?

1.如果放在cookie里面,浏览器的安全策略会帮你做些安全检查,比如跨域不传输,非安全协议不传输,禁止脚本操作cookie等等,如果跟在参数上是没有这些功能的

2.无论是app,webview,还是浏览器,经常需要把地址分享到第三方,如果习惯在url上带token,那么,分享是要把token去掉才行,如果放在cookie就不用了,cookie不会被分享出去的

3.如果参数传输token,无论post get ,只要是需要鉴权的请求,你都要手动把token搭上,如果放在cookie,你只要放一次,只要补跨域,不过期,浏览器自己会在请求时给你传过去,省心省力,妈妈再也不担心漏掉token了,cookie还有许多其它规范,不再赘述

4.cookie有自己的规范和约束,不是哪哪都能用,所以很多时候必须请求参数里带token,比如常见的跨域授权后跳转


=> cookie是浏览器负责维护的,不灵活。现在的“终端”不止浏览器了

=> cookie 可以用来保存 token,也可以用来保存其他东西;
同样的,token 既能保存在 cookie 中,也能保存在其他地方。
所以,不是一个维度的东西

=> 作为安卓bug员,乱说一点吧,你截获密码密文,app要你输入明文,如果你输入密文会再次加密传递,除非你篡改app或者用请求软件模拟请求,这个还得反编译,现在大一点的软件都有加固混淆啥的,反编译也不是很容易,越涉及到金钱,安全性越高,而且后台的哥们也不是吃干饭的,他们还有别的通信安全策略,总体来说,除了有仇或者巨大利益,不然很少有人去黑...

=> 最近在写angular。 登录时服务器给客户端token存在本地,每次请求客户端都会附在http header,让服务器都会先验证token再操作。


參考文獻:

[iOS 开发]如何处理 iOS 原生网络请求中的 cookie ?
https://www.jianshu.com/p/d144bd7226b7

Wikipedia - HTTP cookie:
https://en.wikipedia.org/wiki/HTTP_cookie

聊一聊 cookie:
https://segmentfault.com/a/1190000004556040

NSHTTPCookieStorage 官方文档:
https://developer.apple.com/reference/foundation/nshttpcookiestorage
中文版:http://www.jianshu.com/p/b10652a1803e

iOS平台下cookie的使用:
http://www.jianshu.com/p/65094611980c

iOS HTTP网络请求Cookie的读取与写入(NSHTTPCookieStorage)
http://www.skyfox.org/ios-url-request-cookie.html

NSHTTPCookieStorage state not saved on app exit. Any definitive knowledge/documentation out there?
http://stackoverflow.com/questions/5837702/nshttpcookiestorage-state-not-saved-on-app-exit-any-definitive-knowledge-docume

app开发token、cookie的区别,账号密码加密又是如何保证安全?
https://www.zhihu.com/question/39137156

为什么 APP 要用 token 而不用 session 认证?
https://www.v2ex.com/t/148426

How to manage sessions with AFNetworking?
http://stackoverflow.com/questions/10984374/how-to-manage-sessions-with-afnetworking/11039784#11039784

Persisting Cookies In An iOS Application?
http://stackoverflow.com/questions/4597763/persisting-cookies-in-an-ios-application

NSHTTPCookieStorage and Cookie Expiration Date
http://stackoverflow.com/questions/7203641/nshttpcookiestorage-and-cookie-expiration-date/7209706#7209706

Can I set the cookies to be used by a WKWebView?http://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a-wkwebview

haifengkao/YWebView:https://github.com/haifengkao/YWebView

https://www.jianshu.com/p/4fb94b4a281e

https://www.jianshu.com/p/e56fbc8940b2


程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...