Keycloak과 OAuth2 / OIDC

Keycloak과 OAuth2 / OIDC

1️⃣ Authorization Code Flow

1. OAuth2 Authorization Code Flow란?

사용자가 Keycloak을 통해 로그인하면, 애플리케이션이 Authorization Code를 받고, 이를 통해 Access Token을 발급받는 표준적인 인증 방식입니다.

이 흐름은 서버 사이드 앱이나 보안이 중요한 SPA + Backend 구조에서 많이 사용됩니다.


2. 아키텍처 및 플로우

사용자 ─────▶ 앱(클라이언트)
                │
                ▼
         Keycloak 로그인 페이지
                │
                ▼
     사용자 로그인 후 Authorization Code 발급
                │
                ▼
  앱이 Authorization Code로 Access Token 요청
                │
                ▼
         Keycloak에서 Access Token 발급

Authorization Code Flow


3. 요청 예시

GET /auth/realms/myrealm/protocol/openid-connect/auth?
  client_id=myapp&
  response_type=code&
  redirect_uri=https://myapp.com/callback&
  scope=openid

응답 예시:

https://myapp.com/callback?code=abc123

2️⃣ Implicit Flow, Client Credentials Flow

1. Implicit Flow

과거 SPA(Pure JS) 앱에서 사용하던 방식.
Access Token을 직접 URL로 발급받아 보안상 취약하여 현재는 거의 사용 ❌

response_type=token

Keycloak에서는 기본적으로 비활성화되어 있음 (보안상 권장 X)


2. Client Credentials Flow

서버 간 통신 또는 머신 간 인증 시 사용.
사용자 없이 Client ID/Secret으로 인증하여 토큰을 받습니다.

📦 예: 백엔드 API → Keycloak → 토큰 → 다른 서비스 API 호출

curl -X POST \
  https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token \
  -d "grant_type=client_credentials" \
  -d "client_id=myclient" \
  -d "client_secret=abc123"

응답 예시:

{
  "access_token": "eyJhbGciOi...",
  "expires_in": 300
}

3️⃣ 토큰 구조 (Access Token, Refresh Token, ID Token)

1. Access Token

  • API에 접근할 때 사용
  • JWT 형식 (Base64 인코딩)
  • 예:
{
  "sub": "user123",
  "preferred_username": "alice",
  "exp": 1712345678,
  "realm_access": {
    "roles": ["user", "admin"]
  }
}

2. Refresh Token

  • Access Token이 만료되었을 때 재발급 요청에 사용
  • 보통 길게 유지됨 (15분 ~ 30일)

3. ID Token

  • 사용자 프로필 정보 포함 (OIDC 전용)
  • 클라이언트가 사용자의 이름, 이메일, 로그인 시간 등을 확인할 때 사용

예:

{
  "name": "Alice Kim",
  "email": "alice@example.com",
  "auth_time": 1712345600
}

4️⃣ Token Introspection 및 사용자 정보 엔드포인트

1. Token Introspection

토큰 유효성 확인을 위한 API.
사용 예: 리소스 서버가 외부에서 받은 토큰을 검증할 때

요청:

curl -X POST \
  -d "token=eyJhbG..." \
  -u "client_id:client_secret" \
  https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/token/introspect

응답:

{
  "active": true,
  "username": "alice",
  "exp": 1712345678
}

2. 사용자 정보 엔드포인트

ID 토큰과 별개로 사용자 정보를 조회 가능

요청:

curl -H "Authorization: Bearer ACCESS_TOKEN" \
  https://keycloak.example.com/auth/realms/myrealm/protocol/openid-connect/userinfo

응답:

{
  "sub": "user-uuid",
  "name": "Alice Kim",
  "preferred_username": "alice",
  "email": "alice@example.com"
}

🔚 요약

항목 설명
Authorization Code Flow 가장 안전하고 표준적인 로그인 방식
Implicit Flow 현재는 거의 사용 안 함 (보안 취약)
Client Credentials Flow 백엔드 간 인증 시 사용
Access Token API 접근 권한
Refresh Token Access Token 재발급
ID Token 사용자 정보 포함
Introspection 토큰 유효성 검증
UserInfo Endpoint 사용자 정보 조회 API

RSS Feed
마지막 수정일자