Java/Java
[JPA] JAVA Spring Boot JWT(Json Web Token) 사용하기
백엔드 신입사원( soft 5.10 입사)
2022. 6. 30. 18:51
반응형
시크릿키를 어딘가에 작성하여 노출시키는 것보단 10자리의 랜덤 함수를 이용해 사용하면 좋을 것 같아 보였다. (더 좋은 해결 방법이 있을까요?)
public static String random(){
Random rnd = new Random();
StringBuffer sb = new StringBuffer();
for(int i=0; i<10; i++){
int index = rnd.nextInt(3);
switch (index){
case 0:
sb.append((char) (rnd.nextInt(26) + 97));
break;
case 1:
sb.append((char) (rnd.nextInt(26) + 65));
break;
case 2:
sb.append(rnd.nextInt(10));
break;
}
}
return sb.toString();
}
전역 변수로 함수를 만들었고 Base64로 인코딩 시킨 랜덤값을 만들어 두었다.
private static String secretKey = Base64.getEncoder().encodeToString(random().getBytes());
// secretKey 생성
아이디 값을 토큰 생성될때 payload에 같이 담을 예정이다. 생성한 발행일과 토큰 만료일은 1일로 지정했으며 시그니처 코드에 시크릿 키값을 담는다.
public static String createAdminAccessToken(String Id){
Date now = new Date();
long dateTime = 60*60*24;
Claims claims = Jwts.claims();
claims.put("Id", Id);
return Jwts.builder()
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
.setClaims(claims)
.setIssuedAt(now) // 토큰 생성 시간
.setExpiration(new Date(now.getTime() + (dateTime))) // exp 1-day
.signWith(SignatureAlgorithm.HS512, secretKey) // 암호화 알고리즘 , 복호화 사용할 키값
.compact();
}
유효성 검증과 유효시간 확인이 한번에 되는 형식보단 차례로 진행되는 게 좋아 보였다.
public static Jwt<JwsHeader, Claims> validateToken(String jwtToken){ // 유효성 검증
try {
Jwt<JwsHeader, Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwtToken);
return claims;
} catch (Exception e){
return null;
}
}
public static boolean expiredToken(Jwt<JwsHeader, Claims> claims){ // 유효시간 확인
return claims.getBody().getExpiration().before(new Date());
}
컨트롤러에서는 아래 작업을 해주어 토큰 값을 뽑아냈다.
String AccessToken = AccessJWT.createAdminAccessToken(Id);
반응형