@PostConstruct
public void init() {
이
@PostConstruct메서드는 JWT 서명을 위한 암호화 키 (Key)를 초기화하는 핵심 과정이다.
@PostConstruct는 Spring에서 빈(Bean)이 생성되고 나서 자동으로 호출되는 초기화 메서드이다.@Component, @Service, @Configuration 등으로 등록된 클래스의 인스턴스가 의존성 주입을 모두 마친 뒤 한 번 실행된다.@Value로 주입된 secretKey를 가공하여 Key 객체를 만들기 위해 사용된다. byte[] keyBytes = Decoders.BASE64.decode(secretKey);
secretKey는 Base64로 인코딩된 문자열이다 (예: "dGhpc2lzYXZlcnlzZWNyZXRrZXlmb3Jqd3Q=")Decoders.BASE64.decode(...)는 이 문자열을 byte 배열로 디코딩한다.String secretKey = "dGhpc2lzYXZlcnlzZWNyZXRrZXlmb3Jqd3Q=";
// 디코딩 후: byte[] keyBytes = [116, 104, 105, 115, ... ]
this.key = Keys.hmacShaKeyFor(keyBytes);
Keys.hmacShaKeyFor(byte[])는 JJWT 라이브러리의 유틸 메서드이다.byte[] 값을 기반으로 HMAC-SHA용 SecretKey 객체를 생성한다.key는 JWT를 서명(Sign)하거나 검증(Verify)할 때 사용된다.| 코드 | 설명 |
|---|---|
@PostConstruct | 의존성 주입 완료 후 자동 실행 |
Decoders.BASE64.decode(secretKey) | Base64 문자열 → 바이트 배열 변환 |
Keys.hmacShaKeyFor(keyBytes) | HMAC용 암호화 키 객체 생성 (JWT 서명용) |
this.key | 생성된 Key를 클래스 필드에 저장해 나중에 사용 |
@Value("${jwt.secret.key}")
private String secretKey;
@Value("${jwt.secret.key}"), private String secretKey;, private Key key; 이 세 줄은 JWT 서명(Signing)을 위한 시크릿 키를 외부 설정에서 불러오고, 실제 암호화용 키 객체로 변환하는 과정의 시작 부분이다.
@Value 어노테이션은 Spring에서 외부 설정값을 주입받기 위해 사용한다."${jwt.secret.key}"는 application.yml 또는 application.properties에 정의된 값을 가져온다.# application.yml 예시
jwt:
secret:
key: dGhpc2lzYXZlcnlzZWNyZXRrZXlmb3Jqd3Q=
secretKey에는 "dGhpc2lzYXZlcnl5ZWNyZXRrZXlmb3Jqd3Q="라는 문자열이 주입된다.private Key key;private Key key;
Key는 JWT를 서명(Sign)하거나, 파싱(Verify)할 때 사용하는 암호화 키이다.java.security.Key 또는 보통 JJWT에서 제공하는 io.jsonwebtoken.security.Keys 관련 클래스에 의해 생성된 객체이다.이 key는 아래 @PostConstruct 메서드에서 초기화된다:
@PostConstruct
public void init() {
byte[] keyBytes = Decoders.BASE64.decode(secretKey);
this.key = Keys.hmacShaKeyFor(keyBytes);
}
여기서 secretKey는 문자열이기 때문에, 실제 서명을 하기 위해 byte 배열로 디코딩(Base64) 후,
Keys.hmacShaKeyFor(byte[]) 메서드를 사용해서 Key 객체로 변환한다.
| 구성 | 설명 |
|---|---|
@Value | 외부 설정에서 secret key 문자열 주입 |
secretKey | base64 인코딩된 문자열 (암호화용 키 원본) |
key | 실제 JWT 서명에 사용될 Key 객체 (javax.crypto.SecretKey) |
| 사용 이유 | JWT를 안전하게 서명하고 검증하기 위함 (HS256 사용 시 필수) |
public String createToken(Long userId, String email, String nickname)
이 메서드는 JWT를 직접 생성하는 함수이다.
userId, email, nickname)를 JWT의 Claim으로 포함해서 Access Token을 생성하는 메서드이다.Bearer 접두사 포함)Date date = new Date();
Date 객체 생성.issuedAt (토큰 발행 시점)과 expiration (만료 시점) 계산에 사용된다.return prefix + Jwts.builder()
Jwts.builder()는 JJWT에서 제공하는 JWT 생성 빌더 시작점이다.prefix는 일반적으로 "Bearer "이다."Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." .setSubject(String.valueOf(userId))
sub(subject)에 userId를 저장. .claim("email", email)
.claim("nickname", nickname)
.setExpiration(new Date(date.getTime() + tokenLife))
tokenLife는 밀리초 단위의 유효기간이다. 예를 들면 15분짜리 토큰이면 tokenLife = 15 * 60 * 1000LtokenLife만큼 더한 시간이 만료 시간(exp)이 된다. .setIssuedAt(date)
iat, issued at)을 현재 시각으로 설정한다. .signWith(key, SignatureAlgorithm.HS256)
key는 Base64 디코딩된 Secret Key이고, SignatureAlgorithm.HS256은 HMAC-SHA256 알고리즘이다. .compact();
위의 빌더 체인들을 실제 JWT 문자열로 변환한다.
이 문자열은 일반적으로 3개의 부분으로 구성된 JWT이다:
<Header>.<Payload>.<Signature>
리턴되는 최종 결과는 대략 아래와 같다:
Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMiLCJlbWFpbCI6InRlc3RAZ21haWwuY29tIiwibmlja25hbWUiOiJ0ZXN0dXNlciIsImlhdCI6MTY4OTc1NzYwMCwiZXhwIjoxNjg5NzU4NDAwfQ.Ks5QBhZb5-...
| 필드 | 설명 |
|---|---|
sub | 사용자 고유 ID |
email, nickname | 사용자 정보 (커스텀 Claim) |
iat, exp | 토큰 발급 시점, 만료 시점 |
key, HS256 | 서명 키 및 알고리즘 |