使用JWT进行浏览器接口请求,在使用Cookie进行会话保持传递Token时,可能会存在 CSRF 漏洞问题,同时也要避免在产生XSS漏洞时泄漏Token问题,如下图在尽可能避免CSRF和保护Token方面设计了方案。
要点解释如下:
将JWT存入Cookie的优点是无需显式传递,并且对于 image 和文件下载接口比较友好,但是要特别注意设置 HttpOnly
参数禁止通过JS 的方式获取 Cookie,这样能在系统某些场景发生XSS漏洞时也能避免Cookie泄漏。
但是基于Cookie的缺点是会存在CSRF跨站攻击问题。为了避免CSRF问题可以通过自定义Header方式进行接口调用,所以我们可以在使用Cookie存储传递JWT的基础上,增加一个无实际意义并且唯一的sessionId(同时存入浏览器sessionStorage和JWT内容中),每个接口调用都从sessionStorage中读取sessionId并设置到自定义Header中调用接口传递sessionId,在服务端使用过滤器或者拦截器验证自定义header中sessionId的值是否和JWT中的值一致来保证合法性。
注:JWT只是防篡改,但是默认情况下它body区域的内容是不加密的,如果你需要存储相对敏感信息在JWT中,可以对内容区域进行加密,在服务端解密读取内容。
(END)