基于http协议通信的APP安全策略的一点思考

声明一点,我没做过过任何商业APP,以下想法仅仅是个人业余时间的一点思考,若你是专业人员,不吝赐教。

概述

微信开发过程中,会使用到微信服务器提供的API,这些API都是基于HTTP协议调用的,为什么我们自己的APP服务器不采用这种方式呢?

这种方式最直观的好处就是,API设计得足够好时,服务器只需要开发一次,无论前端是 WEB,APP ,APK…都通过http调用API请求数据并响应。

这种方式类似于传统C/S模型的开发,服务端/客户端定义相同序列的数据结构(称之为通信协议),差别在于现在用http协议,数据类型由之前的二进制流变成文本(XML/JSON)格式。

这篇文章主要介绍,在这种模式下的开发过程及安全性上的思考。

登录过程

基于HTTP的APP会遇到服务器无状态问题,比如客户端发起API调用:GetUserInfo,,服务器如何判断这个用户是谁?

最先想到的就是,每一个API调用都带上用户的用户名和密码,这种方法确实太笨。

这里提供一个思路是:服务器保存很多带有锁的盒子,盒子里存储用户信息,用户登录成功之后,获得一把钥匙,以后的用户请求就只需要提供这把钥匙,简单过程如下:

1、用户提供用户名和密码发送登录请求

2、服务器检查用户名和密码是否正确,错误则直接失败。若通过检查,则生成一把访问令牌,把用户信息放到这把访问令牌对应的的盒子里,向用户返回访问令牌。

3、用户向服务器发出获取用户订单信息请求,并带上从服务器获取到的 访问令牌。

4、服务器用访问令牌打开盒子,获取到用户的基本信息,再从数据库查出用户订单信息,返回用户。

5、以后的用户和服务器交互重复 3、4步骤

这主要参考了微信公众号的做法:微信公众号:获取用户信息

微信公众号 要获取一个关注者的信息,需要的条件是 AccessToken和这个关注者的ID(OpenID)。并没有提供公众号信息,而是用一个AccessToken(访问令牌)代替,也就是说微信服务器保存了一个 < 访问令牌,公众号信息 > 列表,通过AccessToken可以获取到一个微信公众号相关信息。

而这个AccessToken是怎么获取的呢?微信公众号:获取AccessToken

微信公众号 要获取一个AccssToken需要提供 公众号ID(AppID)和一个密码(Secret),这不是相当于提供用户名和密码去获取AccessToken(访问令牌)吗?

通信过程的安全性

从上面的的介绍可知,每次用户都会发送HTTP请求,一个典型的交互过程如下:以JSON数据格式为例

Request:

{"Command": "GetOrderList","AccessToken": "3bf63b28-bdd2-4bb1-80b0-8d5b42070222"}

Response:

{"success": true,"OrderList": [{"NO": "20150327131072","OrderTime": "2015-03-27 09:33:20","TotalCost": 118,"Detail": [{"Product": {"GUID": "4bb603b2-0916-412d-ae51-b296c838673b","Name": "时蔬锅摊","MainPicture": "5(8).JPG"},"Count": 1,"Price": 28},{"GUID": "630e38dd-60ae-4ed0-98f0-affea23c5fee","Product": {"GUID": "da9dce4a-101e-45dc-a88e-3b5e296ca092","Name": "香锅猪蹄","MainPicture": "2(1).JPG"},"Count": 1,"Price": 58},{"GUID": "6018c248-64e2-4185-98db-c1408aa0d482","Product": {"GUID": "a405b104-f0eb-488c-ac41-a8a3de2f0bca","Name": "农家酥肉汤","MainPicture": "7(10).JPG"},"Count": 1,"Price": 32}]},{"NO": "20150325131079","OrderTime": "2015-03-25 17:38:15","TotalCost": 58,"Status": 2,"Detail": [{"GUID": "77df4888-8c88-4c51-b669-7471a8ae975b","Product": {"GUID": "da9dce4a-101e-45dc-a88e-3b5e296ca092","Name": "香锅猪蹄","MainPicture": "2(1).JPG"},"Count": 1,"Price": 58}]}]}可以看到,用户获取自己的订单,提供了 访问令牌 ,返回用户订单,这里展示下显示效果~

从上面通信过程可以看到,均是由明文在网络中传输中,,而对于用户订单这么敏感的数据,实在不妥。一旦在传输过程中,这个 访问令牌 被截获,后果不堪设想,也就是说我们要想办法去保证传输过程中的安全性。

一想到传输过程中的安全性,我们一下就想到了HTTPS,对传输的所有数据都进行加密。HTTPS无疑可以解决这个问题,它被设计的目的就是为了保证传输过程中的安全性。

当我们安全性不需要做到像 银行 那种级别,HTTPS是否是最佳的方案呢?我看未必,你可以向下看,接下来提供一种思路。

参考QQ邮箱的做法:QQ邮箱登陆页面

登录页面

有的旅行是为了拓宽眼界,浏览风景名胜。

基于http协议通信的APP安全策略的一点思考

相关文章:

你感兴趣的文章:

标签云: