Skip to content

서명 알고리즘

CyberGo JWT 는 4 종류 총 12 개의 서명 알고리즘을 지원하며, 단일 애플리케이션부터 마이크로서비스 아키텍처까지 다양한 시나리오를 다룹니다.

알고리즘 개요

타입알고리즘키 타입적용 시나리오
HMACHS256 / HS384 / HS512대칭 키단일 애플리케이션, 단순 서비스
RSARS256 / RS384 / RS512공개 키/개인 키마이크로서비스, 다중 서비스 검증
RSA-PSSPS256 / PS384 / PS512공개 키/개인 키마이크로서비스 (RSA 대체 권장)
ECDSAES256 / ES384 / ES512공개 키/개인 키고성능 마이크로서비스

HMAC (대칭 키)

HMAC 은 동일한 키로 서명하고 검증하는 가장 간단한 방식입니다.

키 요구사항

  • 최소 32 바이트
  • 라이브러리가 약한 키를 자동으로 감지합니다 (예: 순수 반복 문자, 단순 증가 시퀀스 등)

사용법

go
cfg := jwt.DefaultConfig()
cfg.SecretKey = "hmac-key-that-has-at-least-32-bytes!"
cfg.SigningMethod = jwt.SigningMethodHS256 // 기본값, 생략 가능

알고리즘 선택

상수알고리즘설명
SigningMethodHS256HMAC-SHA256권장, 성능과 보안의 균형
SigningMethodHS384HMAC-SHA384더 높은 보안성
SigningMethodHS512HMAC-SHA512최고 보안성

권장

대부분의 시나리오에서는 HS256을 사용하면 충분합니다. 키는 암호학적으로 안전한 난수로 생성하고 길이는 최소 32 바이트 이상으로 하는 것을 권장합니다.

RSA (비대칭 키)

RSA 는 개인 키로 서명하고 공개 키로 검증합니다. 검증 측에서 개인 키를 보유할 필요가 없는 시나리오에 적합합니다.

사용법

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodRS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey (선택)

검증 키

VerificationKey는 선택 사항입니다. 설정하지 않으면 라이브러리가 SigningKey를 사용하여 검증합니다 (내부적으로 개인 키에서 공개 키를 추출).

키 생성

go
// 2048 비트 RSA 키 쌍 생성
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

알고리즘 선택

상수알고리즘설명
SigningMethodRS256RSA-SHA256권장
SigningMethodRS384RSA-SHA384더 높은 보안성
SigningMethodRS512RSA-SHA512최고 보안성

RSA-PSS (비대칭 키, RSA 대체 권장)

RSA-PSS 는 RSA 의 개선된 서명 방식으로, 확률적 서명 방식 (PSS) 패딩을 사용하여 PKCS#1 v1.5 보다 보안성이 뛰어납니다. 키는 RSA 와 동일합니다.

사용법

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodPS256
cfg.SigningKey = rsaPrivateKey        // *rsa.PrivateKey (RSA 와 키 공유)
cfg.VerificationKey = rsaPublicKey    // *rsa.PublicKey (선택)

대체 권장

RSA-PSS 는 RSA PKCS#1 v1.5 보다 안전하므로 신규 프로젝트에서는 RSA-PSS 알고리즘을 우선 사용하는 것이 좋습니다. 키는 RSA 와 완전히 동일하므로 추가로 생성할 필요가 없습니다.

알고리즘 선택

상수알고리즘설명
SigningMethodPS256RSA-PSS-SHA256권장
SigningMethodPS384RSA-PSS-SHA384더 높은 보안성
SigningMethodPS512RSA-PSS-SHA512최고 보안성

ECDSA (타원 곡선)

ECDSA 역시 비대칭 알고리즘이지만, 키가 더 짧고 성능이 더 좋습니다.

사용법

go
cfg := jwt.DefaultConfig()
cfg.SigningMethod = jwt.SigningMethodES256
cfg.SigningKey = ecdsaPrivateKey      // *ecdsa.PrivateKey
cfg.VerificationKey = ecdsaPublicKey  // *ecdsa.PublicKey (선택)

키 생성

go
// P-256 곡선 키 쌍 생성
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
    log.Fatal(err)
}
publicKey := &privateKey.PublicKey

알고리즘 선택

상수알고리즘곡선설명
SigningMethodES256ECDSA-SHA256P-256권장
SigningMethodES384ECDSA-SHA384P-384더 높은 보안성
SigningMethodES512ECDSA-SHA512P-521최고 보안성

선택 방법

text
단일 애플리케이션 ──────────→ HMAC
마이크로서비스 (동일 신뢰 도메인) ──→ HMAC
마이크로서비스 (교차 서비스 검증)→ RSA, RSA-PSS 또는 ECDSA
보안 우선 ────────────────→ RSA-PSS (RSA 대체)
고성능 요구 ──────────────→ ECDSA
키 길이 민감 ─────────────→ ECDSA
고려 요소HMACRSARSA-PSSECDSA
서명 속도빠름느림느림빠름
검증 속도빠름빠름빠름빠름
키 길이32+ 바이트2048+ 비트2048+ 비트256+ 비트
서명 길이고정김 (~256 바이트)김 (~256 바이트)짧음 (~64 바이트)
아키텍처 결합강결합느슨한 결합느슨한 결합느슨한 결합
보안성높음높음더 높음높음

보안 주의사항

금지 사항

  • 코드에 키를 하드코딩하지 마세요
  • 약한 키를 사용하지 마세요 (숫자만, 반복 문자 등)
  • none 알고리즘을 사용하지 마세요 (본 라이브러리는 자동으로 거부함)
  • HMAC 키는 32 바이트 미만으로 사용하지 마세요

모범 사례

  • 환경 변수 또는 키 관리 서비스를 사용하여 키를 저장하세요
  • 서명 키를 정기적으로 교체하세요
  • 프로덕션 환경에서는 RSA 또는 ECDSA 사용을 권장합니다
  • RSA 키는 2048 비트 이상을 권장합니다

다음 단계