jwts이용한 토큰 생성 및 검증시 아래와 같은 에러가 발생되는 경우 확인 해야 하는 사항들 입니다.

 

A signing key must be specified if the specified JWT is digitally signed

이 에러의 경우 secret key 등록시 해당 정보를 일반 평문으로 주는 경우 발생되는 에러 입니다.

 

String secretKey  ="A";
secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes());

와 같이 base64로 인코딩 해준뒤 key등록을 해줘야 합니다

https://stackoverflow.com/questions/41661821/java-lang-illegalargumentexception-a-signing-key-must-be-specified-if-the-speci

 

java.lang.IllegalArgumentException: A signing key must be specified if the specified JWT is digitally signed

I'm looking to implement JWT in my application for that I'm doing some R&D on it by taking a reference from : https://stormpath.com/blog/jwt-java-create-verify. I was successfully able to imple...

stackoverflow.com

 

JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted

에러가 발생되는 경우

해당 에러는 토큰 검증시 시간이 만료되거나 key가 변경되어 맞지 않거나(간혹 데이터 전송중 특수문자가 들어가는 등의 문제가 생겨 해당 에러를 보는 분들이 있습니다.) 할때 발생되는 문제 입니다.

데이터 확인 시 전달 받은 토큰과 확인 하려는 토큰이 완전 동일한 경우

 

 Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwtToken);

이렇게 코딩 되어 있는건 아닌지 확인 해봐야 합니다. 

setSigningKey부분에 key설정 시 

Base64.getEncoder().encodeToString(secretKey.getBytes());

과 같이 getBytes를 해줘야 정상적으로 인증 되게 되어 있습니다.(secret key 설정시 byte로 등록 후 검증시 string으로 넘겨줘서 key가 달라서 검증 오류가 발생 되는거 같습니다.)

 

 

String secretKey  ="A";
secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes());

long tokenValidMilisecond = 1000L * 60 * 60;

Map<String, Object> headers = new HashMap<>();
headers.put("typ", "JWT"); // Type 설정
headers.put("alg", "HS256"); // HS256는 해시 알고리즘의 일종으로, base64와 같이 임의로 디코딩을 할 수 없다.

Date ext = new Date(); // 토큰 만료 시간
ext.setTime(ext.getTime() + tokenValidMilisecond);

Map<String, Object> payloads = new HashMap<>();
payloads.put("data", "test"); // API 용도에 맞게 properties로 관리하여 사용하는것을 권장한다.
payloads.put("exp", ext);

String jwt = Jwts.builder()
.setHeader(headers) 		// Headers 설정
.setClaims(payloads) 		// Claims 설정
.setSubject("user-auth")	// 토큰 용도  
.setExpiration(ext) 		// 토큰 만료 시간 설정
.signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) // HS256과 Key로 Sign
.compact(); // 토큰 생성


Jws claims = Jwts.parser().setSigningKey(secretKey.getBytes()).parseClaimsJws(jwt);

System.out.println(claims.getBody().getExpiration().before(new Date()));
반응형
Posted by 질주하는구
,