【问题标题】:Store JWT compressed in cookie using Java使用 Java 将 JWT 压缩在 cookie 中
【发布时间】:2018-08-06 11:28:11
【问题描述】:

我正在使用 Java servlet 将带有 JWT 信息的 cookie 返回给客户端。

我返回 2 个 cookie。

1 => Token_id,这个cookie存储了id_token

2 => refresh_token,这个token存储了token过期时要发送的刷新token。

问题是,这些信息太大了,所以浏览器会报这个错误:

431(请求标头字段太大)

为了解决这个问题,我想将 refresh_token 压缩存储,当我使用这些信息时我会解压缩。

我阅读了有关压缩的信息并尝试使用 GZIPCompress 字符串,如下所示:

 public static String compress(final String str) throws IOException {
        if ((str == null) || (str.length() == 0)) {
            return null;
        }
        ByteArrayOutputStream obj = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.flush();
        gzip.close();
        return obj.toString();
    }

当我将压缩字符串添加到 cookie 时,我有这个异常:

Illegal character in cookie value

我无法将 refresh_token 存储在我的服务器中。 如何压缩大字符串以存储在 cookie 中?我需要减小 value cookie 的大小。

【问题讨论】:

    标签: http servlets cookies jwt


    【解决方案1】:

    cookie 只能存储字符串,但您存储的是二进制数据。

    压缩过程的结果是二进制的,不能用字符串表示,即使你调用obj.toString();。您需要将结果编码为 base64 以获得可以存储在 cookie 中的字符串,但是 base64 会增加大约 30% 的大小,所以我不知道这对您的情况是否有意义。

     //storage
     cookie = base64(gzip(str))
    
     //retrieval
     str = gunzip(base64decode(cookie))
    

    刷新令牌通常包含在一个随机字符串中。可能是您包含了太多数据?

    【讨论】:

    • 是的@pedrofb,我的数据太大了。我想压缩字符串的大小,但我知道我需要在 cookie 文件中存储一个字符串。您知道是否有某种方法可以将长字符串加密为短字符串并将其解密为原始字符串?
    • 大多数浏览器支持最多 4096 字节的 cookie。不算太多。我建议您使用 localStorage 而不是 cookie,您将拥有 5 到 10 mb 的空间,具体取决于浏览器。您可能不需要压缩
    • 我使用了localStorage,我不会关闭主题,因为主要主题是减小字符串的大小。
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多