JWT Secret Key 생성하기

알파로그·2023년 5월 17일
2

✏️ 환경설정

  • 시크릿 키 생성
    • 시크릿 키는 되도록 길게 만드는 것이 좋다.
    • 시크릿 키는 절대로 외부에 노출되어선 안된다.
    • git ignore 나 암호화를 사용해 보안을 유지시키자
    • 🔗 Jaypt 로 암호화 하기
custom:
  jwt:
    secretKey: secretKeysecretKeysecretKeysecretKeysecretKeysecretKeysecretKeysecretKeysecretKeysecretKey

✏️ 시크릿 키 생성

📍 시크릿 키 test

  • 시크릿 키의 존재 유무를 확인하는 test 케이스 생성
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class CreateJwtTest {

    @Value("${custom.jwt.secretKey}")
    private String secretKeyPlain;

    @Test
    void 시크릿키_존재_확인() {
        assertThat(secretKeyPlain).isNotNull();
    }
}

📍 생성 테스트

  • 시크릿 키는 application yml 에 생성한 그대로 사용하지 않는다.
    • Base64 를 통해 시크릿 키를 인고딩 한 다음,
      Keys.hmacShaKeyFor()을 사용해 시크릿 키 객체를 생성해 사용한다.
@Test
@DisplayName("sercretKey 원문으로 hmac 암호화 알고리즘에 맞는 SecretKey 객체를 만들 수 있다.")
void t2() {
    // 키를 Base64 인코딩
    String keyBase64Encoded = Base64.getEncoder().encodeToString(secretKeyPlain.getBytes());
    // Base64 인코딩된 키를 이용하여 SecretKey 객체를 만든다.
    SecretKey secretKey = Keys.hmacShaKeyFor(keyBase64Encoded.getBytes());

    assertThat(secretKey).isNotNull();
}

📍 시크릿키 생성

  • 시크릿 키가 필요할 때 cachedSecretKey 를 호출해 사용하면 된다.
    • 필요할 때 마다 매번 생성해야하는 중복을 피하기 위해서 cachedSecretKey 가 null 일 때만 생성하고,
      null 이 아니면 바로 사용할 수 있도록 구현했다.
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Base64;

@Component
public class JwtProvider {

		// 시크릿 키를 담는 변수
    private SecretKey cachedSecretKey;

		// plain 시크릿 키를 담는 변수
    @Value("${custom.jwt.secretKey}")
    private String secretKeyPlain;

		// plain -> 시크릿 키 변환 method
    private SecretKey _getSecretKey() {
        String keyBase64Encoded = Base64.getEncoder().encodeToString(secretKeyPlain.getBytes());
        return Keys.hmacShaKeyFor(keyBase64Encoded.getBytes());
    }

		// 시크릿 키를 반환하는 method
    public SecretKey getSecretKey() {
        if (cachedSecretKey == null) cachedSecretKey = _getSecretKey();

        return cachedSecretKey;
    }
}
profile
잘못된 내용 PR 환영

0개의 댓글