2017-01-18 59 views
0

我正在寫一個非常簡單的任務的Spring應用程序。爲什麼在驗證令牌時nginx-jwt太慢了?

我想比較使用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更快的圖片。

回答

0

不好意思問這個問題。 我弄清楚爲什麼我的nginx-jwt驗證令牌太慢了。那麼只是因爲我在「/」端點使用了限制請求。 當刪除該限制時,由於使用Java應用程序進行驗證,因此在nginx上的驗證並不慢,因此驗證不會太慢