新手心得:登录一次之后,网站是怎么认出你的
你有没有想过,登录一个网站之后,点开十几个页面,它一次密码都没再问过,它到底是怎么认出你的?
把它想象成音乐节入场。
进场的时候,检票口是最严的:你出示身份证、核对票根,确认你就是你。这一关过了,工作人员会在你手腕上盖一个章,特殊油墨,现场的人一眼就能认出来,别人仿不出来。从这一刻起,你在园区里走到哪个舞台、进哪个帐篷,工作人员只看一眼手腕上的章,不会再让你掏一次身份证。
登录令牌(token)就是那个章。
你输入账号密码、通过验证的那一刻,服务器会发给你一串字符,这就是令牌。之后你每次发请求,浏览器都会顺手把它带上,服务器一看就知道这个人已经验过身份了,不用再问密码。
那服务器怎么知道令牌是真的、不是你自己伪造的?最常见的答案叫 JWT。
一个 JWT 长得像三段乱码,用两个点连在一起:前面一段、中间一段、后面一段。前两段分别写着"这张令牌用的什么算法"和"你是谁、什么时候过期"这类信息,都是用一种叫 Base64URL 的方式编码的——注意,是编码,不是加密。任何人拿到令牌都能解开前两段读到里面的内容,所以千万别把密码、手机号这类敏感信息往令牌里塞。
真正起作用的是第三段:签名。服务器发令牌的时候,会拿只有自己知道的密钥,把前两段的内容按约定算法算一遍,得到一个签名贴在最后。你每次拿着令牌回来,服务器就用同一把密钥重新算一次,对得上,说明内容一个字都没被改过;对不上,哪怕你只改了一个字母,也会被当场识破。这就是为什么令牌能防篡改:内容可以公开,签名仿不出来。
为什么不用老办法呢?老办法叫会话(session):服务器在自己那边记一本账,浏览器只拿一个编号,每次来先翻账本。账本法有个麻烦——服务器一多,账本就得几台机器共享,扩容很费劲。令牌是"自包含"的,需要的信息都写在令牌自己身上,服务器不用翻账本,收到就能验,几台服务器轮流接待你也没问题。这也是它在微服务和手机 App 里特别常见的原因。
不过令牌也有它的短板,知道这些才能不踩坑。
第一,令牌一旦发出去,服务器就管不住它了。传统会话可以随时把账本上那一行划掉,等于立刻注销;令牌是自包含的,服务器手里没有开关,注销往往要等它自己过期,或者另外维护一份黑名单。所以很多系统把令牌的有效期设得很短,过期后用一张"刷新令牌"换新的,相当于章只能管两小时,到期回检票口重盖。
第二,令牌丢了就等于钥匙丢了。谁捡到它,谁就能冒充你,直到它过期为止。所以令牌一定要走加密连接传输,也别随手把它贴到聊天记录或者公开的截图里。
第三,解开令牌不等于验证令牌。网上有很多工具能一键解码 JWT,解出来只是读到了内容,离"可信"还差一个验签名的步骤。
对新手来说,记住三句话就够了:登录只验一次,之后靠令牌认人;令牌的内容是公开可读的,靠签名防篡改;令牌管不住吊销,所以有效期越短越安全。下次再看到一串点分三段的乱码,你就知道,手腕上那个章长什么样了。
- 点赞
- 收藏
- 关注作者
评论(0)