본 캠프_68일차

졸용·2025년 6월 1일

TIL

목록 보기
69/144

✅ @PostConstruct

@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 배열로 디코딩한다.
  • JJWT 라이브러리는 HS256 서명 알고리즘을 사용할 때, 적절한 길이의 byte[] 키를 요구한다 (최소 256bit 이상이 필요).

✔️ 예시:

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}")

@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="라는 문자열이 주입된다.
  • 이 문자열은 Base64로 인코딩된 비밀 키이다. (JJWT에서 요구하는 형식)

☑️ 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 문자열 주입
secretKeybase64 인코딩된 문자열 (암호화용 키 원본)
key실제 JWT 서명에 사용될 Key 객체 (javax.crypto.SecretKey)
사용 이유JWT를 안전하게 서명하고 검증하기 위함 (HS256 사용 시 필수)


✅ createToken

public String createToken(Long userId, String email, String nickname)

이 메서드는 JWT를 직접 생성하는 함수이다.

  • 목적: 주어진 사용자 정보(userId, email, nickname)를 JWT의 Claim으로 포함해서 Access Token을 생성하는 메서드이다.
  • 리턴값: 최종 생성된 JWT 문자열 (앞에 Bearer 접두사 포함)

Date date = new Date();
  • 현재 시각을 기준으로 Date 객체 생성.
  • 이 시각은 issuedAt (토큰 발행 시점)과 expiration (만료 시점) 계산에 사용된다.

return prefix + Jwts.builder()
  • Jwts.builder()는 JJWT에서 제공하는 JWT 생성 빌더 시작점이다.
  • prefix는 일반적으로 "Bearer "이다.
    따라서 리턴값은 예를 들면:
    "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

    .setSubject(String.valueOf(userId))
  • JWT의 기본 Claim 중 하나sub(subject)에 userId를 저장.
  • 보통 사용자의 고유 ID를 저장해서 토큰만 보고도 어떤 유저인지 알 수 있도록 한다.

    .claim("email", email)
    .claim("nickname", nickname)
  • 커스텀 Claim을 추가하는 부분이다.
  • JWT에 사용자 이메일과 닉네임을 같이 담아서, 나중에 토큰만 디코딩해도 이 정보들을 쉽게 꺼낼 수 있도록 한다.

    .setExpiration(new Date(date.getTime() + tokenLife))
  • 토큰 만료 시간을 설정한다.
  • tokenLife는 밀리초 단위의 유효기간이다. 예를 들면 15분짜리 토큰이면 tokenLife = 15 * 60 * 1000L
  • 현재 시간에서 tokenLife만큼 더한 시간이 만료 시간(exp)이 된다.

    .setIssuedAt(date)
  • 토큰 발급 시각(iat, issued at)을 현재 시각으로 설정한다.
  • 이는 JWT 표준 Claim 중 하나이다.

    .signWith(key, SignatureAlgorithm.HS256)
  • JWT를 **서명(Sign)**하는 부분이다.
  • 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서명 키 및 알고리즘

profile
꾸준한 공부만이 답이다

0개의 댓글