JWT 인증(3)
728x90

JWT 인증 방법

@Component
public class UtilJwt {


        //KEY  => JWThappytuk
        private String KEY = "Key 값";

        // 제일 처음 시작 Base64로 encoding
        @PostConstruct
        protected void init() {
            this.KEY = Base64.encodeBase64String(KEY.getBytes());
        }

        // token 발급
        public String createTokenByEmailAndClientIp(HttpServletRequest request) { 
            String email = request.getParameter("email");
            String clientIP = UtilRequest.getRemoteAddr(request);

            Map<String,Object> claims = new HashMap<>();
            claims.put("email", email);
            claims.put("clientIP", clientIP);

            return createToken(claims);
        }


        // token 발급
        public String createToken(Map<String, Object> claims) { 
            return Jwts.builder()
                    .setClaims(claims)
                    .signWith(SignatureAlgorithm.아무거나, KEY)
                    .compact();
        }

        //signature 검증
        public boolean validateToken(String token) {
            try {
            this.extractAllClaims(token); //signature 검증이 실패하면 exception
                return true;
            }catch(Exception e){
                e.printStackTrace();

                return false;
            }
        }

        //requestHeader 에서 토큰 추출
        public String resolveTokenFormatRequest(HttpServletRequest request) {
            String bearerToken = request.getHeader("token이 저장된 header의 key 값");
            if(StringUtils.isNotBlank(bearerToken)) {
                return bearerToken;
            }
            return null;
        }
        // 모든 claim 얻기
        public Jws<Claims> extractAllClaims(String token) {

            return Jwts.parser()
                       .setSigningKey(KEY)
                       .parseClaimsJws(token);
        }
        //특정 claim 얻기
        public String getClaims(String token, String key) {
            try {
                return this.extractAllClaims(token)
                        .getBody()
                        .get(key,String.class);
            }catch(Exception e) {
                e.printStackTrace();
                return null;
            }

        }
}

간단한 발급, 검증 클래스를 작성했다.

@PostConstruct

@PostConstruct는 의존성 주입이 이루어진 후 초기화를 수행하는 어노테이션

 

간단히 말하면 처음 의존성이 부여되면 key 값을 base64로 인코딩 한다.

 

createTokenByEmailAndClientIp

email과 clientip 로 token을 생성하는 메서드

 

createToken

payload 만 완성되면 token을 만들어주는 메서드
혹시 email, ip로 파라미터가 안들어 올 수 있어서 생성했다.

 

validateToken

토큰을 검증하는 메서드이다.

 

원래 처음에는 원래 있는 Key로 파라미터로 들어온 토큰을 쪼개서 signature를 제외한 값을 다시 토큰으로 만들어서 생성된 signature 값과 파라미터로 들어온 token을 분리해서 나온 signature 값을 비교하는 메서드로 작성을 했는데 삽질이였다.

 

아래 쪽에서 생성한 extractAllClaims 메소드에서 이미 Claim을 얻는 과정에서 signature 값이 변경 되었다면 Exception이 발생한다...

 

resolveTokenFormatRequest

email과 ip로 토큰을 생성해서 request header에 넣어서 인증을 하는 경우가 생기면 request에 있는 token을 분리하는 메소드가 필요할 거 같아서 만들었다.

 

extractAllClaims

모든 claim 값을 뽑는 메소드, 동시에 검증도 하는 메서드이다.

 

getClaims

토큰에서 특정 값을 추출해야되는 경우가 생기므로 만들었다.

이렇게 해서 발급, 검증 클래스 만드는 것을 완료했다. 나머지는 응용을 해서 회사 소스에 적용해봐야겠다.

728x90

'API > 인증' 카테고리의 다른 글

JWT(2) Spring Boot + JWT 회원가입 및 로그인 예제  (0) 2022.06.09
JWT(1)  (0) 2022.06.09