OAuth 2.0 & OIDC 토큰 분석: ID/Access Token과 JWT

💡 핵심 요약 (Executive Summary)

본 가이드는 json jwt 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents
Reference & Guidelines (NOTE)

ID Token과 Access Token은 OAuth 2.0 및 OpenID Connect(OIDC) 프로토콜에서 사용되는 두 가지 주요 토큰입니다. 구조적으로는 JWT(JSON Web Token) 형식을 사용하더라도 그 목적과 포함된 정보가 다릅니다.

ID Token (OIDC Only) For AuthN
json
{
  "alg": "RS256",
  "typ": "JWT"
}
json
{
  "iss": "https://auth.example.com/",
  "sub": "1234567890",
  "aud": "your-client-id",
  "exp": 1712352000,
  "iat": 1609459200,
  "name": "John Doe",
  "email": "[email protected]"
}
  • Header: 토큰이 RS256 알고리즘으로 서명되었고, JWT 형식을 사용함을 나타냄.
  • Payload:
  • iss: 토큰 발급자(인증 서버).
  • sub: 사용자 ID.
  • aud: 토큰의 대상 (클라이언트 ID).
  • exp: 토큰 만료 시간 (Unix 타임스탬프).
  • iat: 토큰이 발급된 시간.
  • name: 사용자 이름.
  • email: 사용자 이메일.
Access Token (OAuth 2.0 And OIDC) For AuthZ
json
{
  "alg": "HS256",
  "typ": "JWT"
}
json
{
  "iss": "https://auth.example.com/",
  "sub": "1234567890",
  "aud": "https://api.example.com/",
  "exp": 1712352000,
  "scope": "read write",
  "client_id": "your-client-id"
}
  • Header: 토큰이 HS256 알고리즘으로 서명되었고, JWT 형식을 사용함을 나타냄.
  • Payload:
  • iss: 토큰 발급자(인증 서버).
  • sub: 사용자 또는 클라이언트 ID.
  • aud: 자원 서버(토큰이 적용될 API).
  • exp: 토큰 만료 시간.
  • scope: 토큰이 허용하는 권한 범위 (읽기/쓰기).
  • client_id: 클라이언트 ID.

Features

OIDC 인증 순서 — curl로 표현됨 (TODO)
1. [Browser Redirect to OIDC Server] 클라이언트가 사용자 브라우저를 인증 서버로 리다이렉트

사용자를 인증하려면, 브라우저에서 로그인 페이지로 리다이렉트해야 합니다. 이때 클라이언트는 인증 서버에 authorization code를 요청합니다.

shell
curl https://auth.example.com/authorize?
  response_type=code&
  client_id=your-client-id&
  redirect_uri=https://yourapp.com/callback&
  scope=openid%20profile%20email&
  state=your-random-state-value
  • response_type: code (Authorization Code Flow를 의미)
  • client_id: 클라이언트 애플리케이션의 ID
  • redirect_uri: 인증 후 사용자가 리다이렉션될 URI
  • scope: openid는 필수이고, profile, email 등 추가 정보를 요청할 수 있음
  • state: CSRF 공격을 방지하기 위한 랜덤 값

사용자가 로그인하면, 인증 서버는 클라이언트의 redirect_uri로 authorization code를 전달합니다.

1-1. [OIDC Server to Application Server] Authorization Code 콜백
bash
curl https://yourapp.com/callback?code=AUTHORIZATION_CODE&state=your-random-state-value
2. [Application Server to OIDC Server] Authorization Code로 ID Token과 Access Token 발급 요청

authorization code를 사용해 클라이언트가 ID Token과 Access Token을 요청할 수 있습니다.

shell
curl -X POST https://auth.example.com/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://yourapp.com/callback" \
  -d "client_id=your-client-id" \
  -d "client_secret=your-client-secret"
  • grant_type: authorization_code (클라이언트가 받은 코드로 토큰 요청)
  • code: 앞에서 받은 authorization code
  • redirect_uri: 코드 요청 시 사용했던 동일한 리다이렉트 URI
  • client_id: 클라이언트 ID
  • client_secret: 클라이언트의 비밀 키
2-1. Responce
json
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "8xLOxBtZp8"
}
  • access_token: API 접근에 필요한 Access Token.
  • id_token: 사용자 인증 정보가 포함된 ID Token.
  • refresh_token: Access Token이 만료되었을 때 재발급 요청에 사용할 수 있는 토큰.
3. [Client to Application Server] Access Token을 사용해 보호된 자원 요청

Access Token을 사용해 보호된 API를 호출할 수 있습니다.

shell
curl -X GET https://api.example.com/userinfo \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

이 요청은 Access Token을 통해 사용자 정보 또는 다른 자원에 접근할 수 있게 해줍니다.

*4. [Client to JWT Service] ID Token 검증 및 사용자 정보 확인

ID Token은 클라이언트에서 사용자의 신원을 확인하는 데 사용됩니다. 이 토큰을 디코딩하여 사용자의 정보를 얻을 수 있습니다. 이를 JWT 디코더를 이용해 디코딩하거나 클라이언트에서 직접 처리할 수 있습니다.

shell
curl -X POST https://jwt.io/ \
  -H "Content-Type: application/json" \
  -d '{"token": "YOUR_ID_TOKEN"}'

이를 통해 사용자 정보를 확인할 수 있습니다.

요약
  1. 사용자가 로그인 페이지에서 인증하고, authorization code를 얻음.
  2. 이 코드를 사용해 ID Token과 Access Token을 발급받음.
  3. Access Token으로 보호된 자원에 접근.
  4. ID Token으로 사용자의 인증 정보를 확인.

이 순서는 OIDC의 표준 인증 흐름을 기반으로 하며, curl을 통해 API 요청을 어떻게 하는지 보여줍니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *