验证令牌时为什么nginx-jwt这么慢?

时间:2017-01-18 02:22:02

标签: spring nginx lua

我正在编写一个执行非常简单任务的Spring应用程序。

我想比较使用nginx-jwt(Lua)验证令牌的时间,并使用纯Java(jose4j)进行验证。 使用身份验证标头对端点执行POST请求,端点/是我使用nginx-jwt验证的地方,/ token-java是使用Java的端点。

nginx-jwt是一个使用Lua脚本验证令牌的工具,我也编写了一个程序来测试使用java和nginx-jwt验证时间。

public class ComparePerformance {
     private static final String NGINX_VALIDATE_URL = "http://localhost/";
     private static final String JAVA_VALIDATE_URL = "http://localhost/token-java";
     private RestTemplate restTemplate;

    public ComparePerformance() {
        restTemplate = new RestTemplate();
    }

    public long getTimeValidateNginx() {
        return getTimeValidate(NGINX_VALIDATE_URL);
    }

    public long getTimeValidateJava() {
        return getTimeValidate(JAVA_VALIDATE_URL);
    }

    private long getTimeValidate(String url) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", getToken());
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        HttpEntity<String> entity = new HttpEntity<>("parameters", headers);
        long startTime = System.nanoTime();
        for (int i = 0; i < 10; i++) {
            restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
        }
        long endTime = System.nanoTime();
        return endTime - startTime;
    }

    private String getToken() {
        return "Bearer xxxx";
    }

    public static void main(String[] args) {
        ComparePerformance cp = new ComparePerformance();
        long timeNginx = cp.getTimeValidateNginx() / 1_000_000;
        long timeJava = cp.getTimeValidateJava() / 1_000_000;

        LogUtil.log(Level.INFO, cp.getClass(),
            "%nNginx validate time: %dms%n" +
                    "Java validate time: %dms", timeNginx, timeJava);
}

}

这是我在Nginx中的配置:(nginx.conf)

location / {
    access_by_lua '
        local jwt = require("nginx-jwt")
        jwt.auth()
    ';
    proxy_pass http://localhost; 
}

location /token-java {
    proxy_pass http://localhost/token-java
}

这是我的Java验证,我使用jose4j来验证使用算法hs256 - 与nginx-jwt相同,下面是验证和解析令牌的方法:

public Map<String, Object> parseToken(String JWTToken) throws InvalidJwtException {

    Key verificationKey = new HmacKey(secretKey.getBytes());
    JwtConsumer secondPassJwtConsumer = new JwtConsumerBuilder()
            .setExpectedIssuer(officialIssuer)
            .setSkipDefaultAudienceValidation()
            .setVerificationKey(verificationKey)
            .setRequireExpirationTime()
            .setAllowedClockSkewInSeconds(30)
            .setRequireSubject()
            .build();
    JwtClaims jwtClaims = secondPassJwtConsumer.processToClaims(JWTToken);

    return jwtClaims.getClaimsMap();
}

结果如下:

Nginx validate time: 9037ms
Java validate time: 57ms

如您所见,Nginx比Java慢得多。

有人可以解释一下吗? 我很困惑,因为我看到一些照片,Lua比Java快。

1 个答案:

答案 0 :(得分:0)

很抱歉提出这个问题。 我弄清楚为什么我的nginx-jwt验证令牌太慢了。好吧,因为我在“/”端点使用限制请求。 删除该限制时,使用Java app

进行验证时,nginx上的验证速度并不慢