jwts를 활용한 JWT 인증 구현1

행행·2023년 1월 27일
0

1. 토큰을 발급하고 서명위조를 확인해주는 객체를 생성한다.

TokenProvide.java 클래스를 생성한다.


public class TokenProvider {

    //토큰 서명에 사용할 불변성을 가진 비밀 키
    private static final String SECRET_KEY = "Q4NSl604sgyHJj1qwEkR3ycUeR4uUAt7WJraD7EN3O9DVM4yyYuHxMEbSF4XXyYJkal13eqgB0F7Bq4H";

    //토큰 발급 메서드
    public String createToken(UserEntity userEntity){
        //만료시간 설정
        java.util.Date expiryDate = Date.from(
                Instant.now()
                        .plus(1, ChronoUnit.DAYS)
        );

        //토큰생성

        return Jwts.builder()
                //header에 들어갈 서명
                .signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()),
                        SignatureAlgorithm.HS512
                )
                .setSubject(userEntity.getId()) //sub:토큰 식별자
                .setIssuer("todo app")  //iss:발급자정보
                .setIssuedAt(new Date()) //At: 토큰 발급시간
                .setExpiration(expiryDate) //exp: 토큰 만료시간
                .compact();

    }
    //
    /*클라이언트가 보낸 토큰을 디코딩 및 파싱해서 토큰 위조여부 확인
    * @param token - 클라이언트가 전송한 인코딩된 토큰
    * @return 토큰에서 subject(userId)를 꺼내서 반환
    * 유저 식별자 반환
    * */
    public String validateAndGetUserId(String token){

        Claims claims = Jwts.parserBuilder()

                //토큰 발급자의 발급당시 서명을 넣어줌
                .setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes()))
                .build()
                //토큰을 디코딩 서명기록을 파싱
                //클라이언트 토큰의 서명과 서버발급당시 서명을 비교
                //위조되지 않았다면 'body'에 페이로드(Claims)를 리턴
                //위조되었으면 예외를 발생시킴
                .parseClaimsJws(token)
                .getBody();
        return claims.getSubject();
    }

}
profile
성장하려고 분투 중인 개발자

0개의 댓글