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);

 

반응형