0Pricing
C# Academy · 강의

JWT 구조와 클레임

헤더, 페이로드 및 서명을 이해합니다.

JWT 구조와 클레임은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

JWT란 무엇인가요

JSON 웹 토큰(JWT)은 두 당사자 간에 클레임을 안전하게 전송하는 데 사용하는 간결하고 URL에 안전한 토큰 형식입니다. ASP.NET Core에서는 상태 비저장 API를 인증하는 가장 일반적인 방법입니다.

JWT는 점으로 연결된 세 개의 Base64Url 인코딩 부분으로 이루어진 문자열일 뿐입니다. header.payload.signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0Iiwicm9sZSI6ImFkbWluIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

헤더

헤더는 토큰의 서명 방식을 설명합니다. 헤더는 첫 번째 세그먼트로 Base64Url 인코딩되는 작은 JSON 객체입니다.

alg는 서명 알고리즘(예: HS256, RS256)을 나타내며, typ는 거의 항상 JWT입니다.

{
  "alg": "HS256",
  "typ": "JWT"
}

페이로드

페이로드는 사용자에 대한 설명과 토큰의 메타데이터인 클레임을 전달합니다. 페이로드는 두 번째 세그먼트입니다.

중요: 페이로드는 인코딩만 되며 암호화되지는 않습니다. 누구나 디코딩할 수 있으므로 여기에 비밀 정보를 넣지 마십시오.

{
  "sub": "1234",
  "name": "Alice",
  "role": "admin",
  "exp": 1735689600
}

서명

서명은 토큰이 변조되지 않았음을 보장합니다. 서버는 인코딩된 헤더, 인코딩된 페이로드, 비밀 키를 사용하여 서명을 계산합니다.

누군가 페이로드의 문자 하나라도 변경하면 서명이 더 이상 일치하지 않아 검증에 실패합니다.

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secretKey
)

등록된 클레임

일부 클레임 이름은 JWT 사양(RFC 7519)에 따라 표준화되어 있습니다. 이러한 이름에는 세 글자로 된 짧은 키가 사용됩니다.

  • iss - 발급자
  • sub - 주체(사용자 ID)
  • aud - 대상
  • exp - 만료 시간(Unix 초)
  • nbf - 이 시간 이전에는 유효하지 않음
  • iat - 발급 시각
{
  "iss": "https://api.myapp.com",
  "aud": "myapp-clients",
  "sub": "42",
  "exp": 1735689600,
  "iat": 1735686000
}

사용자 지정 클레임

등록된 집합 외에도 애플리케이션에 필요한 사용자 지정 클레임을 역할, 권한, 테넌트 ID, 이메일 등의 형태로 추가할 수 있습니다.

모든 클레임은 모든 요청마다 전송되므로 페이로드를 작게 유지하십시오.

{
  "sub": "42",
  "email": "alice@myapp.com",
  "role": "admin",
  "tenant_id": "acme",
  "permissions": ["orders:read", "orders:write"]
}

ASP.NET Core의 claims

.NET에서 claims는 System.Security.Claims.Claim 형식으로 모델링됩니다. 각 클레임은 형식 / 값 쌍입니다.

JWT가 검증되면 ASP.NET Core는 페이로드의 각 항목을 사용자의 ClaimsPrincipal에 있는 Claim으로 변환합니다.

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, "42"),
    new Claim(ClaimTypes.Name, "Alice"),
    new Claim(ClaimTypes.Role, "admin"),
    new Claim("tenant_id", "acme")
};

ClaimsPrincipal과 ClaimsIdentity

인증된 사용자는 ClaimsPrincipal로 표현되며, 이는 하나 이상의 ClaimsIdentity 개체를 감싸고 있고 각 개체는 claims 집합을 보유합니다.

컨트롤러에서는 User를 통해 이 개체에 접근합니다.

// Inside a controller action
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
bool isAdmin = User.IsInRole("admin");
string? tenant = User.FindFirst("tenant_id")?.Value;

Claim 형식 매핑

기본적으로 JWT handler는 짧은 JWT key를 긴 URI 스타일의 클레임 형식으로 매핑합니다(예를 들어 sub는 ClaimTypes.NameIdentifier가 됩니다).

원래의 짧은 이름을 유지하려면 앱 시작 시 수신 매핑을 한 번 비활성화하십시오.

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
// Now User.FindFirst("sub") returns the raw 'sub' claim

세션 쿠키를 그냥 사용하면 안 되나요?

JWT는 자체 완결형입니다. 따라서 서버는 데이터베이스 조회나 서버 측 세션 저장소 없이 signing key만 사용해 이를 검증할 수 있습니다.

이 특성 덕분에 수평 확장된 API와 마이크로서비스에 적합하며, 어느 노드에서나 동일한 token을 검증할 수 있습니다.

// Client sends the token on every request:
// Authorization: Bearer eyJhbGciOiJIUzI1Ni...

절충안: 폐기

JWT는 자체 완결형이고 만료될 때까지 신뢰되므로 exp 시각 전에 하나를 쉽게 폐기할 수 없습니다.

일반적인 완화책은 access token의 수명을 짧게 설정하고 refresh token과 함께 사용하는 것입니다(이 과정은 이 강좌의 뒤에서 다룹니다).

// Short-lived access token
exp = iat + 15 * 60;  // 15 minutes

빠른 확인

JWT 구조에 대한 이해도를 확인해 보십시오.

복습

JWT의 구조와 ASP.NET Core에서 claims가 작동하는 방식을 배웠습니다.

  • JWT는 header.payload.signature이며, 각 부분은 Base64Url로 인코딩됩니다.
  • 페이로드에는 등록된 및 사용자 지정 claims가 들어 있으며, 암호화되지는 않고 인코딩됩니다.
  • 서명은 비밀 또는 key 쌍을 사용해 무결성을 보장합니다.
  • .NET은 claims를 ClaimsPrincipal로 변환하며, User를 통해 읽을 수 있습니다.

다음으로 ASP.NET Core에서 이러한 token을 검증하도록 구성합니다.

자주 묻는 질문

“JWT 구조와 클레임” 강의는 무료인가요?

네 — “JWT 구조와 클레임” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“JWT 구조와 클레임”에서 뭘 배우나요?

헤더, 페이로드 및 서명을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“JWT 구조와 클레임” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JWT 구조와 클레임
  2. JWT 전달자 인증 구성
  3. 토큰 발급
  4. 새로 고침 토큰과 만료
← C# Academy(으)로 돌아가기