ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 JWT (코드스니펫)
    스프링 2023. 4. 20. 21:20

    1.JWT토큰 생성 방법 decode한 byte값만 만들어서 넣어주는 방법

    2. key객체를 만들어서 쓰는 방법

     

     

    build.gradle의 dependencies에 추가

     

    compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'


    application.properties

     

    jwt.secret.key=7ZWt7ZW0OTntmZTsnbTtjIXtlZzqta3snYTrhIjrqLjshLjqs4TroZzrgpjslYTqsIDsnpDtm4zrpa3tlZzqsJzrsJzsnpDrpbzrp4zrk6TslrTqsIDsnpA=


    토큰 생성에 필요한 값

     

    // Header KEY 값
    public static final String AUTHORIZATION_HEADER = "Authorization";
    // 사용자 권한 값의 KEY
        public static final String AUTHORIZATION_KEY = "auth";
    // Token 식별자
        private static final String BEARER_PREFIX = "Bearer ";
    // 토큰 만료시간
        private static final long TOKEN_TIME = 60 * 60 * 1000L;

    @Value("${jwt.secret.key}")       //@Value를 사용하면 application properties에 있는 jwt.key값을 가져온다.
        private String secretKey;       //객체가 만들어 질때 application properties에 있는 값을 가져와서 저장
        private Key key;                    //토큰을 만들 때 넣어줄 키값
        private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        @PostConstruct   //처음에 객체가 생성될 때 초기화 해주는 함수
        public void init() {
            byte[] bytes = Base64.getDecoder().decode(secretKey);   

           //secretKey를 가지고 와서 한번 decode해줌 
            key = Keys.hmacShaKeyFor(bytes);    // byte배열로 받은 다음에 key객체에 넣어줌
        }


    // header 토큰을 가져오는 메서드
        public String resolveToken(HttpServletRequest request) { //헤더에 우리가 가져와야할 토큰이 있다 request로 받아옴
            String bearerToken = request.getHeader(AUTHORIZATION_HEADER); 

    // uest.getHeader로 AUTHORIZATION_HEADER 에 있는 토큰 값을 가져온다.
            if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) {

    //가지고 온 코드가 존재하는지 BEARER로 시작을 하는지 
                return bearerToken.substring(7);  //substring을 사용해서 앞에 7글자 지워주기
            }
            return null;
        }


    // 토큰 생성  (실제로 토큰이 만들어지는 부분)
        public String createToken(String username, UserRoleEnum role) {
            Date date = new Date();

            return BEARER_PREFIX +
                    Jwts.builder()
                    .setSubject(username)
                    .claim(AUTHORIZATION_KEY, role)
                    .setExpiration(new Date(date.getTime() + TOKEN_TIME))
                    .setIssuedAt(date)
                    .signWith(key, signatureAlgorithm)
                    .compact();
        }


    // 토큰 검증 
        public boolean validateToken(String token) {
            try {
                Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
                return true;
            } catch (SecurityException | MalformedJwtException e) {
                log.info("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
            } catch (ExpiredJwtException e) {
                log.info("Expired JWT token, 만료된 JWT token 입니다.");
            } catch (UnsupportedJwtException e) {
                log.info("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
            } catch (IllegalArgumentException e) {
                log.info("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
            }
            return false;
        }


    // 토큰에서 사용자 정보 가져오기
        public Claims getUserInfoFromToken(String token) {
            return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
        }


    전체코드

     

    package com.sparta.myselectshop.jwt;


    import com.sparta.myselectshop.entity.UserRoleEnum;
    import io.jsonwebtoken.*;
    import io.jsonwebtoken.security.Keys;
    import io.jsonwebtoken.security.SecurityException;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;

    import javax.annotation.PostConstruct;
    import javax.servlet.http.HttpServletRequest;
    import java.security.Key;
    import java.util.Base64;
    import java.util.Date;

    @Slf4j
    @Component
    @RequiredArgsConstructor
    public class JwtUtil {

        public static final String AUTHORIZATION_HEADER = "Authorization";
        public static final String AUTHORIZATION_KEY = "auth";
        private static final String BEARER_PREFIX = "Bearer ";
        private static final long TOKEN_TIME = 60 * 60 * 1000L;

        @Value("${jwt.secret.key}")
        private String secretKey;
        private Key key;
        private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        @PostConstruct
        public void init() {
            byte[] bytes = Base64.getDecoder().decode(secretKey);
            key = Keys.hmacShaKeyFor(bytes);
        }

        // header 토큰을 가져오기
        public String resolveToken(HttpServletRequest request) {
            String bearerToken = request.getHeader(AUTHORIZATION_HEADER);
            if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) {
                return bearerToken.substring(7);
            }
            return null;
        }

        // 토큰 생성
        public String createToken(String username, UserRoleEnum role) {
            Date date = new Date();

            return BEARER_PREFIX +
                    Jwts.builder()
                    .setSubject(username)
                    .claim(AUTHORIZATION_KEY, role)
                    .setExpiration(new Date(date.getTime() + TOKEN_TIME))
                    .setIssuedAt(date)
                    .signWith(key, signatureAlgorithm)
                    .compact();
        }

        // 토큰 검증
        public boolean validateToken(String token) {
            try {
                Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
                return true;
            } catch (SecurityException | MalformedJwtException e) {
                log.info("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
            } catch (ExpiredJwtException e) {
                log.info("Expired JWT token, 만료된 JWT token 입니다.");
            } catch (UnsupportedJwtException e) {
                log.info("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
            } catch (IllegalArgumentException e) {
                log.info("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
            }
            return false;
        }

        // 토큰에서 사용자 정보 가져오기
        public Claims getUserInfoFromToken(String token) {
            return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
        }

    }

     

     

Designed by Tistory.