본문 바로가기
보안/Security-인증

Spring에서 JWT Token 사용하기 위한 설정 정리

by 문자메일 2022. 11. 20.

 

1. build.gradle

 

runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'

implementation 'org.springframework.boot:spring-boot-starter-security'

 

2. 토큰 생성하는 JwtTokenUtils.java 클래스 만들기

package com.example.sns.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;

public class JwtTokenUtils {

    public static String generateToken(String userName, String key, long expiredTimeMs){
        Claims claims = Jwts.claims();
        claims.put("userName", userName);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expiredTimeMs))
                .signWith(getKey(key), SignatureAlgorithm.HS256)
                .compact();
    }

    private static Key getKey(String key){
        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
        return Keys.hmacShaKeyFor(keyBytes);
    }
}

 

3. 서비스/로그인 메서드에서 JwtTokenUtils.generateToken() 스태틱 메서드 호출해서 token 받기

@Value("${jwt.secret-key}")
private String secretKey;

@Value("${jwt.token.expired-time-ms}")
private Long expiredTimeMs;
public String login(String userName, String password){
    // 회원가입 여부 체크
    UserEntity userEntity = userEntityRepository.findByUserName(userName).orElseThrow(()->new SnsApplicationException(ErrorCode.USER_NOT_FOUND, String.format("%s not founded", userName )));

    // 비밀번호 체크
    if(!encoder.matches(password, userEntity.getPassword())){
        throw new SnsApplicationException(ErrorCode.INVALID_PASSWORD);
    }

    // 토큰 생성
    String token = JwtTokenUtils.generateToken(userName, secretKey, expiredTimeMs);

    return token;
}

 

4. jwt token 만드는데 필요한 secret-key 값과 expired 시간 값은 application.yml에 따로 저장

jwt:
  secret-key: fast_campus.sns-application-2022.secret_key
  # 30day
  token:
    expired-time-ms: 2592000000

'보안 > Security-인증' 카테고리의 다른 글

IAM Role 설명  (0) 2024.03.17
JWT의 구조 정리  (0) 2023.07.30
JWT, 세션 인증  (0) 2023.04.06
Spring Security 페이지 권한 설정 방법 (authorization)  (0) 2022.11.20

댓글