Token通讯测试
作者:谎言诞行    发布时间:2026年09月10日

欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved1关于Token通讯测试0.前言首先,在前后端交互方案上,个人是倾向于使用Token的方式进行认证的。因为,像手机APP或者电脑客户端这些平台,它们是没有Cookie这种东西的。所以,使用Session+Cookie的方式无法兼容手机APP和电脑客户端平台。在目前社会上Token的解决方案中,JWT是比较流行的。JWT,全称为JSONWebToken,是一个开放标准,用于在各方之间安全地传输信息作为一个自包含的JSON对象。简单来说,你可以把它想象成一个数字身份证或安全通行证。这个通行证里不仅包含了你的身份信息,还内置了防伪标识。最关键的是,它是经过数字签名的,这意味着任何人(包括你自己)都无法篡改其中的内容,否则接收方立刻就能发现。但是,这里有一需要强调一下。Token只是一个身份认证的处理,并非权限处理。它只是确认访问者是否为一个已登记的用户。至于权限和登陆处理,还需要后端额外提供服务。1.服务的响应流程由于,在服务处理上,涉及到了多个服务(操作验证、身份验证、权限验证)。所以,这个流程是非常复杂的。不过,这里我们只是验证Token通讯是否可行,所以只绘制关于Token通讯相关的环节。具体如下图:图1-12.JWT(JSONWebToken)的原理JWT的原理是,服务器认证以后,生成一个JSON对象,发回给用户。这以后,用户与服务端通信的时候,都要发回这个JSON对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。服务器就不保存任何session数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。2.1.JWT是什么?欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved2JWT(JSONWebToken)是一种用于用户身份验证和信息安全传输的令牌机制。它以JSON格式的数据在客户端和服务端之间传递,通常用于用户登录后的授权。简单说:你登录成功后,服务器发你一个“身份证”——JWT,你之后访问资源就带着它,不用每次都重新登录。2.2.JWT的结构(由三部分组成)JWT是一个由“.”分隔的三段字符串,格式如下:header.payload.signature。其生成效果如下图所示:图2-1下面,我们将对每一段的内容进行解析。2.2.1.Header(头部)说明Token的类型和签名算法:图2-22.2.2.Payload(负载)存放用户的非敏感信息,比如用户ID、用户名、角色等;也可放一些标准字段如exp(过期时间)。图2-32.2.3.Signature(签名)是用于防篡改的签名,防止中间人修改Payload。欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved3图2-42.3.JWT的核心机制a)用户登录成功,服务器根据用户信息生成一个JWT(签名加密);b)客户端保存该JWT(通常放在浏览器本地存储或前端缓存);c)每次请求API时,把JWT放在请求头:图2-5d)服务器解析JWT,校验签名、检查是否过期,并基于其中的信息完成鉴权。2.4.JWT的典型使用场景序号场景说明1.登录认证用户登录后获得令牌2.单点登录(SSO)多系统共享登录状态3.接口调用授权API接口访问权限控制4.移动端/前后端分离Token代替传统Session表2-12.5.JWT的安全建议序号安全点建议1.签名密钥保密secret必须保存在服务端,不可泄露2.不存敏感信息Payload是明文可解码,不要放密码、身份证等3.设置过期时间用exp字段控制有效期,定期刷新4.使用HTTPS防止Token被中间人截获5.加签算法选择推荐HS256或RSA(非对称更安全)表2-2在具体实现上,我们一般使用双Token方案来保证安全性。AccessToken用于访问服务获取数据,RefreshToken用于请求新的AccessToken来续期。AccessToken一般存储在内存中,如果关闭页面或者退出App,则AccessToken失效。而RefreshToken存储在安全的本地加密文件中,保证Token不会轻易被窃取。另外,在使用RefreshToken进行续期操作时,还可以增加一个随机校验,保证Token的真实性。当然,我们在签名密钥的处理上,可以增加一个更新策略,即每隔一段时间,变更一次密钥。欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved42.6.JWT示例(真实令牌样式)图2-6注意:实际上的字符串是一行的,这里为了方便查看,所以显示成3行。2.7.后端中如何生成JWT?(以Java为例)这里,我们用一个简单的程序代码,演示如何生成JWT。注意,这里并非最终实现方式。图2-73.关于Token的存储安全首先,我们这里是双Token方案。所以对于不同类型的Token有不同的存储方法。但是,有一点要注意的是,当用户主动登出(注销)时,要把所有的Token信息删除。否则,可能有安全隐患。在使用Cookie存储Token时,将Cookie的maxAge设置为-1,它就只存在于浏览器内存中。当浏览器关闭,自动消失,不会保存。另外,Cookie的domain需要设置为根域名(mickarea.net),否则可能前后端分离后,Javascript的异步请求,无法自动携带Cookie。比如:前端设置为:https://frontend.mickarea.net,后端设置为:https://api.mickarea.net它们的Cookie可以自动携带。3.1.访问型Token(AccessToken)的存储对于访问型的Token,它是用于数据请求的。一般来说,为了避免Token泄露,它的有效时间是非常短的(一般都是按分钟为单位,比如:5-10分钟)。另外,为了保证安全性,它的存储一般是软件内存中。这样的话,其它程序一般情况下是拿不到这个信息的。而且当软件退出,这个信息就不存在了,因为没有存储到本地。如果对于网页应用,可以保存在一个httponly的Cookie中。这个Cookie的path值最好设置为“/”。另外,如果是网页请求(不管是url还是ajax请求),浏览器会自动携带Cookie信息,所以不用额外增加什么请求头。关于这种Cookie的设置,可以参考以下说明:欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved5图3-13.2.续期型Token(RefreshToken)的存储对于续期型的Token,它是用于请求新的AccessToken使用的。为了避免泄露,一般来说,它应该存储在一个加密的或者安全的文件中。比如,我们的移动端App产品,应该使用“安全存储-Keychain(iOS)/Keystore(Android)”。在一些跨平台框架上,也有一些已经封装好了的处理。比如ReactNative社区的react-native-keychain或Flutter的flutter_secure_storage。这些库封装了上述平台原生安全存储的API,提供了一套统一的JavaScript/Dart接口。在浏览器的RefreshToken管理上,相对来说稍微严峻。因为,浏览器并没有提供一个可靠的加密存储方式。如果网页应用要求不高,可以单独设置一个安全的Cookie来存储RefreshToken。如果安全要求比较严格,可以使用WebCryptoAPI+IndexedDB的方式,自己做一个加密的存储管理。IndexedDB是一个浏览器本地数据库,它提供了同源策略。4.关于服务安全的额外保障在这个服务通讯上,除了Token的安全之外,还有一些安全问题需要讨论的,具体如下几点:4.1.关于https协议的使用简单来说,HTTPS协议主要通过两大核心机制:加密和身份认证,来防御特定类型的网络攻击。下面我们来详细拆解一下,HTTPS能防御哪些常见攻击,以及它不能防御哪些攻击。➢能防御的常见攻击方式:⚫窃听/网络嗅探。HTTPS对HTTP的请求和响应进行了端到端的加密。即使攻击者截获了数据,看到的也只是加密后的乱码,无法解读出原始内容。⚫数据篡改/中间人攻击。HTTPS具有完整性校验机制。数据传输过程中,任何微小的修改都会导致解密失败,浏览器会向用户发出警告,连接也会中断。⚫冒充/仿冒网站。HTTPS要求服务器必须提供由全球公认的证书颁发机构(CA)签发的数字证书。这个证书就像网站的“身份证”,证明了“这个网站就是它声称的那个网站”。浏览器会严格验证这张身份证的真伪。➢无法防御的攻击方式:⚫网络钓鱼。如果攻击者注册了一个与真实网站极其相似的域名(如paypa1.com代替paypal.com),并且也为这个假域名申请了HTTPS证书(现在证书很容易获取),那么浏览器依然会显示“安全”的小锁。⚫恶意软件/病毒。HTTPS保护的是传输过程中的数据安全。它无法阻止你已经感染了病毒的电脑窃取你的本地数据,也无法阻止你从网上下载一个被恶意软件感染的文件。⚫服务器被入侵。HTTPS保护的是数据传输的通道。如果网站服务器本身被黑客攻破,数据库里的用户数据(密码、个人信息等)同样会泄露。安全是一个链条,HTTPS只是保护了“传输”这一环。⚫应用层漏洞。如果网站本身存在安全漏洞,如SQL注入、跨站脚本(XSS)等,即使使用了HTTPS,攻击者依然可以利用这些漏洞进行攻击。HTTPS不负责修复网站代码层面的漏洞。欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved64.2.关于XSS(跨站脚本)和CSRF(跨站请求伪造)的防御。XSS防御:核心原则是绝不信任用户输入。将所有用户输入都视为不可信的。➢对用户输入的数据进行HTML转义(例如,将<变成<),确保其始终被当作数据显示,而非代码执行。➢在HTTP头中设置Content-Security-Policy,明确告诉浏览器只允许执行来自特定来源的脚本,从根本上杜绝内联脚本和未授权脚本的运行。这是最有效的现代防御手段。➢对用户输入进行严格的格式、长度、类型检查,但此方法应作为辅助,不能单独依赖。CSRF防御:核心原则是防止伪造的请求。确保请求确实来自用户自愿操作的前端页面。➢在表单或请求中,加入一个随机生成的、不可预测的Token。服务器验证该Token的有效性。伪造的请求无法得知这个Token➢将Cookie设置为SameSite=Strict或SameSite=Lax。这可以阻止浏览器在跨站请求中自动发送认证Cookie,从源头切断CSRF。➢检查HTTP请求头中的Origin或Referer字段,判断请求是否来自合法的源(即你自己的网站域名)。一句话总结:防XSS,重点是防止外部脚本在你网站上的执行;防CSRF,重点是防止别人伪造你用户的身份发请求。4.3.关于非法的API请求。由于本次系统升级增加了对外的数据开放API。所以,需要对所有API请求进行校验。在处理方式上,一般都是注册一个授权码。这个授权码有不同类型的一些关联信息,比如:平台类型(网页、APP、客户端)、设备指纹等等。通过这个API的授权码,在某种程度上可以鉴定客户端的真伪,以及其平台特征。另外,对于每一个授权码,我们可以设置访问次数限制。超过限制了,就无法访问API服务。这样,也就无法再获取API服务提供的数据了。关于访问次数的限制,可以用Java内存缓存+数据库表的方式来处理。4.4.关于设备信息特征采集。考虑Token与设备绑定在安全上,通过客户端(浏览器、移动端、PC客户端)信息采集,能够实时分析和数据比对,用于判定是否有人盗用账号。另外,在登陆验证时,也可以使用移动设备的生物特征验证。在登陆管理上,目前的计划是开放多平台共享的。所以,我们需要知道,到底那些客户端是正常的,那些客户端是异常的。如果Token信息和设备信息都采集到了,可以进行比对。这样可以过滤掉异常的访问。4.5.在高风险应用中实施Root/Jailbreak检测在高风险应用中实施Root(Android)和Jailbreak(iOS)检测至关重要,这能有效保护敏感数据和业务逻辑。在高风险应用中,单一的检测方法很容易被绕过。一个健壮的检测方案应该是多层次、多维度的,并且将检测逻辑放在应用的不同层级。你可以参考下表来构建你的防御体系:序号检测层面主要检测目标/方法关键优点局限性/对抗手段1.Java/Kotlin(Android)Swift/Objective-C(iOS)-检查已安装的Root/越狱相关应用-检查常见的越狱文件路径-检查系统属性(ro.debuggable,test-keys等)实现相对简单,覆盖范围广易被Hook框架(如Frida、Xposed)绕过;Magisk等工具可以隐藏痕迹2.Native(C/C++)层-检测加载的异常库/符号-检测ptrace反调试比应用层更难被篡改,可以检测底层需要对抗Native层的Hook;可能存在兼容性欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved7序号检测层面主要检测目标/方法关键优点局限性/对抗手段-检查进程列表中的异常进程钩子问题3.完整性校验-校验应用签名-校验自身classes.dex、原生库等关键文件哈希值防止应用被重打包或篡改需要安全的服务端支持和基准值存储4.外部attestation服务-GooglePlayIntegrityAPI-GoogleSafetyNetAttestation依赖谷歌的服务进行设备完整性认证,权威性较高存在网络延迟;需要服务端验证;有调用配额限制5.行为分析与环境检测-检测调试器是否附加-检测是否运行在模拟器/仿真器-检测执行su命令的耗时从行为层面发现异常,难以静态隐藏可能产生误报;实现逻辑相对复杂表4-1需要注意的常见问题:➢误报问题:某些非Root的定制化ROM或小众设备也可能触发检测规则。需要通过充分的测试和白名单机制,尽可能降低误报的影响。➢性能影响:在Native层进行大量或复杂的检查可能会影响应用启动速度或运行时性能。务必优化检测逻辑的执行时机和频率,例如在应用启动时进行必要的基础检查,在用户触发敏感操作前再进行深度检查。➢用户隐私与合规:在收集和设备环境相关的信息时,必须遵守相关的隐私法规(如GDPR、个人信息保护法)。在你的隐私政策中明确告知用户,并确保数据的安全传输与处理。5.交互报文设计这里的报文,主要用于服务测试用,并非最终的报文。目前,主要有几个服务用于测试。它们分别是:登陆、续期、注销、算术功能。下面,我们一一对齐展开讨论。http协议中,常用的几个响应的状态码如下:序号状态码说明1.200请求成功。一般用于GET与POST请求2.401请求要求用户的身份认证3.403服务器理解请求客户端的请求,但是拒绝执行此请求4.404服务器无法根据客户端的请求找到资源5.405客户端请求中的方法被禁止6.500服务器内部错误,无法完成请求表5-1注意:在浏览器环境,我们使用Cookie会更为安全。因为,它可以设置为不被Javascript读取。并且,可以通过https请求附带Token信息。不用额外设置报文头Authorization信息。序号功能链接1.登陆https://api.mickarea.net/commons/userLogin.ac2.续期https://api.mickarea.net/commons/userRenew.ac3.注销https://api.mickarea.net/tests/userLogout.ac4.算术功能(测试用)https://api.mickarea.net/tests/mathTester.ac欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved8表5-25.1.功能:登陆5.1.1.请求报文序号位置参数名是否必须用途参数值1.报文头Accept-Language否报文的语言信息en、de、zh等等2.报文头X-Client-Type否自定义的客户端类型BROWSER、MOBILE_APP、PC3.报文头Authorization是传送Token值Bearer“空格”AccessToken4.请求报文体username是传送账户名USER00015.请求报文体password是传送密码123456表5-35.1.2.响应报文注意:只有当请求成功,才会返回token相关信息。序号位置参数名是否必有用途参数值1.响应头status是http响应状态码200、404、500等等2.响应报文体httpStatus是http响应状态码200、404、500等等3.响应报文体serviceStatus是服务端状态SUCCESS、FAIL、ERROR4.响应报文体description是关于相应的描述5.响应报文体accessToken否访问用token6.响应报文体refreshToken否续期用token表5-45.2.功能:续期5.2.1.请求报文序号位置参数名是否必须用途参数值1.报文头Accept-Language否报文的语言信息en、de、zh等等2.报文头X-Client-Type否自定义的客户端类型BROWSER、MOBILE_APP、PC3.报文头Authorization是传送Token值Bearer“空格”refreshToken表5-55.2.2.响应报文注意:只有当请求成功,才会返回token相关信息。序号位置参数名是否必有用途参数值1.响应头status是http响应状态码200、404、500等等欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved9序号位置参数名是否必有用途参数值2.响应报文体httpStatus是http响应状态码200、404、500等等3.响应报文体serviceStatus是服务端状态SUCCESS、FAIL、ERROR4.响应报文体description是关于相应的描述5.响应报文体accessToken否访问用token表5-65.3.功能:注销5.3.1.请求报文序号位置参数名是否必须用途参数值1.报文头Accept-Language否报文的语言信息en、de、zh等等2.报文头X-Client-Type否自定义的客户端类型BROWSER、MOBILE_APP、PC3.报文头Authorization是传送Token值Bearer“空格”accessToken表5-75.3.2.响应报文序号位置参数名是否必有用途参数值1.响应头status是http响应状态码200、404、500等等2.响应报文体httpStatus是http响应状态码200、404、500等等3.响应报文体serviceStatus是服务端状态SUCCESS、FAIL、ERROR表5-85.4.功能:算术这个功能只是用于测试整个闭环是否可以正常运行。5.4.1.请求报文序号位置参数名是否必须用途参数值1.报文头Accept-Language否报文的语言信息en、de、zh等等2.报文头X-Client-Type否自定义的客户端类型BROWSER、MOBILE_APP、PC3.报文头Authorization是传送Token值Bearer“空格”accessToken4.请求报文体param1是计算的第一个参数15.请求报文体param2是计算的第一个参数26.请求报文体opt是计算的运算符add、sub、multi、div表5-95.4.2.响应报文欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved10序号位置参数名是否必有用途参数值1.响应头status是http响应状态码200、404、500等等2.响应报文体httpStatus是http响应状态码200、404、500等等3.响应报文体serviceStatus是服务端状态SUCCESS、FAIL、ERROR4.响应报文体result否显示响应结果3表5-106.工作进度序号内容完成任务类型任务细节开始日期结束日期1.理论学习及方案编写√文档编写文档2025/10/242025/10/272.服务端程序测试√程序后端校验、报文设计2025/10/282025/11/203.客户端程序测试√程序前端校验(网页、客户端程序)2025/11/102025/11/20表6-17.工作总结根据前面的测试结果来看,整体验证基本通过,Token的接收、发送、验证、续期都可以正常处理。7.1.关于服务的流程闭环这里,我简单绘制一个业务功能的处理闭环流程。图7-17.2.关于权限验证的处理在验证处理上,使用JavaEE中的Filter是比较简单的一种。在程序上,Filter比Servlet处理时间更早。也就欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved11是说,在Servlet处理之前,Filter已经把权限验证过了。样例代码如下:图7-27.3.关于Token的生成、存储、发送在Token的分发和处理上有2种方式:Cookie和字符串。其中,字符串的分发是正常情况下的处理。它通过响应报文返回Token字符串。而Cookie则是浏览器特有的处理方式。在浏览器Javascript发送请求后,响应报文会返回Token字符串,同时在响应头信息还会附带Cookie内容。对于浏览器,同一个域名的Cookie是可以共享的,它在发起请求时自动附带,不用Javascript额外处理。而且,对于Cookie还可以进一步设置其安全性,比如:不让Javascript读取,仅通过ssl协议传送等等。7.3.1.Token的生成首先,在生成的算法上,我们选择了RS256。这算法它的特点是,使用了RSA算法进行数字签名处理。它使用RSA的私钥进行数字签名,然后用RSA的公钥进行信息验证。在很大程度上保证了密钥的安全性。在生成时,为了保证Token的安全性,可以把Access和Refresh两种Token的生成密钥对分开。即不同类型的Token使用不同的密钥对。另外,如果有更强的安全管理需要,可以按照一个用户使用一个密钥对的处理方式。另外,在JWT生成时,它使用了Base64URL编码。它的设计目的是使编码结果可以作为文件名或URL地址使用。在标准Base64字母表中包含了一些对于URL和文件名来说无效的字符,因此Base64URL进行了适当的修改以避免这些问题。Base64URL采用与标准Base64相同的算法,但在以下方面有所不同:⚫将"+"替换为"-"(减号)⚫将"/"替换为"_"(下划线)⚫不需要填充字符"="⚫禁止使用行分隔符。下面是一个测试用的token信息以及其解码后的信息。欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved12图7-3图7-4图7-5在Token的生成处理上,有几个东西是建议要写入的。具体如下:图7-6欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved13图7-7Token的生成代码,参数如下:图7-87.3.2.Token的存储在存储上,浏览器的处理是相对简单的,它用Cookie即可。在Cookie的处理上,maxAge=-1的Cookie不会保存到本地,只会存在于浏览器内存中。当浏览器关闭,Cookie就消失了。目前有2个Token,对于访问型Token可以用这个方式,只保存在内存中。而续期型Token保存在http-only的Cookie中,用于续期处理。对于非浏览器环境,可以将Token值保存在安全的本地文件。7.3.3.Token的发送在Token的发送处理上,一般都是将Token放入http请求头中。请求头的名字是Authorization。它的值是以Bearer为前缀的一个字符串。在浏览器上,一般使用Cookie来存储Token,并且发送请求时,也自动附带Cookie给服务器。不过它有一个前提,那就是Cookie的domain、path、secure,这些值都要匹配。欢迎使用mickarea.net出品版权所有Copyright©2025mickarea.netAllrightsreserved14在前后端分离的情况下,前端和后端可能有不同的服务器域名。所以,会产生一个跨域的问题。这时,需要后端和前端都设置一下才能通讯成功。举例如下:前端Javascript请求后台服务代码参考如下:图7-9后端跨域处理代码参考如下:图7-10在跨域时请求时,前端是frontend.mickarea.net,后端是api.mickarea.net。这样两个域名都在一个根域名mickarea.net下面。Cookie设置domain为mickarea.net就可以共享Cookie了。8.结论Token通讯测试通过,方案可行。

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新