✏️ 환경설정
- 시크릿 키 생성
- 시크릿 키는 되도록 길게 만드는 것이 좋다.
- 시크릿 키는 절대로 외부에 노출되어선 안된다.
- 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() {
String keyBase64Encoded = Base64.getEncoder().encodeToString(secretKeyPlain.getBytes());
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;
@Value("${custom.jwt.secretKey}")
private String secretKeyPlain;
private SecretKey _getSecretKey() {
String keyBase64Encoded = Base64.getEncoder().encodeToString(secretKeyPlain.getBytes());
return Keys.hmacShaKeyFor(keyBase64Encoded.getBytes());
}
public SecretKey getSecretKey() {
if (cachedSecretKey == null) cachedSecretKey = _getSecretKey();
return cachedSecretKey;
}
}