Skip to content

오류 처리

CyberGo JWT 는 센티넬 오류 (sentinel errors) 패턴을 사용하며, 모든 오류는 errors.Is()로 판별합니다.

기본 패턴

go
claims, valid, err := processor.Validate(tokenString)
if err != nil {
    switch {
    case errors.Is(err, jwt.ErrTokenExpired):
        // 토큰 만료
    case errors.Is(err, jwt.ErrTokenRevoked):
        // 토큰이 취소됨
    case errors.Is(err, jwt.ErrTokenInvalidIssuer):
        // 발급자 불일치
    case errors.Is(err, jwt.ErrTokenInvalidAudience):
        // 수신자 불일치
    case errors.Is(err, jwt.ErrInvalidToken):
        // 서명 무효 또는 형식 오류
    case errors.Is(err, jwt.ErrProcessorClosed):
        // Processor 가 종료됨
    default:
        // 기타 오류
    }
}

errors.Is() 사용

err == jwt.ErrTokenExpired 또는 문자열 매칭을 사용하지 마세요. errors.Is()는 래핑된 오류를 올바르게 처리합니다.

오류 분류

설정 단계

jwt.New()는 다음 오류를 반환할 수 있습니다:

오류원인해결 방법
ErrInvalidConfig여러 설정 항목이 올바르지 않음Config 각 필드 확인
ErrInvalidSecretKeyHMAC 키가 32 바이트 미만이거나 약한 키더 강한 키 사용
ErrInvalidSigningMethod지원하지 않는 서명 알고리즘내장 12 개 알고리즘 중 하나 사용

토큰 작업

오류메서드처리 제안
ErrEmptyToken모든 토큰 작업 메서드요청 헤더 확인
ErrInvalidTokenValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevoked서명 불일치, 접근 거부
ErrAlgorithmMismatchValidate, Refresh, ValidateInto, RefreshInto토큰 알고리즘이 설정과 불일치, 접근 거부
ErrExpirationRequiredValidate, Refresh, ValidateInto, RefreshIntoRequireExpiration 활성화되었으나 토큰에 exp 선언 없음
ErrTokenTypeMismatchRefresh, RefreshInto액세스 토큰 (token_type=access) 으로 갱신 시도, 접근 거부
ErrTokenExpiredValidate, Refresh, ValidateInto, RefreshInto사용자에게 토큰 갱신 안내
ErrTokenNotValidYetValidate, Refresh, ValidateInto, RefreshInto시계 동기화 확인
ErrTokenInvalidIssuerValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevoked발급자 불일치
ErrTokenInvalidAudienceValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevoked수신자 불일치
ErrTokenRevokedValidate, Refresh, ValidateInto, RefreshInto토큰이 취소됨, 접근 거부
ErrInvalidClaimsCreate, CreateRefresh, Validate, Refresh, ValidateInto, RefreshInto비즈니스 검증 실패
ErrTokenMissingIDRevoke, IsRevoked토큰에 jti 가 없음

속도 제한 및 블랙리스트

오류메서드처리 제안
ErrRateLimitExceededCreate, CreateRefresh, Refresh, RefreshInto429 반환
ErrBlacklistNotConfiguredRevoke블랙리스트 설정

라이프사이클

오류메서드처리 제안
ErrProcessorClosed모든 메서드Processor 재생성
ErrStoreClosedRevoke 등저장소가 종료됨

오류 타입

ValidationError

필드 수준 검증 실패 시 반환되며, 구체적인 필드와 오류 정보를 포함합니다:

go
type ValidationError struct {
    Field   string  // 오류가 발생한 필드명
    Message string  // 오류 설명
    Err     error   // 내부 오류
}

웹 서비스에서의 오류 처리

go
func handleProtected(w http.ResponseWriter, r *http.Request) {
    tokenString := extractToken(r)
    claims, valid, err := processor.Validate(tokenString)
    if err != nil {
        switch {
        case errors.Is(err, jwt.ErrTokenExpired):
            http.Error(w, "token expired", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrTokenRevoked):
            http.Error(w, "token revoked", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrInvalidToken):
            http.Error(w, "invalid token", http.StatusUnauthorized)
        default:
            http.Error(w, "auth failed", http.StatusUnauthorized)
        }
        return
    }
    if !valid {
        http.Error(w, "invalid token", http.StatusUnauthorized)
        return
    }
    // 요청 처리
}

다음 단계