본문 바로가기
Springboot/Springboot Security

OpenID Connect (OIDC)

by xogns93 2024. 12. 18.

OpenID Connect (OIDC)OAuth 2.0을 기반으로 한 인증(Authentication) 프로토콜입니다. OIDC는 사용자를 인증하고 그 결과를 애플리케이션(클라이언트)과 공유하기 위한 표준 프로토콜입니다. OAuth 2.0이 권한 부여(Authorization)를 처리하는 반면, OIDC는 인증(Authentication)에 초점을 맞춥니다.


1. OIDC란?

  • OpenID Connect는 OAuth 2.0의 확장으로, 사용자 인증을 위한 ID 토큰을 제공합니다.
  • 인증 후 사용자 정보를 애플리케이션에 전달하여 사용자를 식별하고 세션을 생성합니다.
  • 주로 싱글 사인온(SSO) 시스템을 구현할 때 사용됩니다.

2. OIDC의 주요 구성 요소

  1. ID Token:

    • 사용자의 인증 정보를 포함하는 JWT(JSON Web Token) 형식의 토큰.
    • 사용자 ID, 발급자 정보, 만료 시간 등의 정보를 포함합니다.
    • 클라이언트는 이 토큰을 통해 사용자를 식별합니다.
  2. UserInfo Endpoint:

    • 인증된 사용자에 대한 추가 정보를 가져오기 위한 엔드포인트.
    • 예: 이름, 이메일, 프로필 사진 등.
  3. Authentication Flow:

    • OIDC는 OAuth 2.0의 권한 부여 방식을 확장하여 인증을 처리합니다.
    • 주요 플로우:
      • Authorization Code Flow (서버-사이드 인증)
      • Implicit Flow (클라이언트-사이드 인증, 사용 지양)
      • Hybrid Flow (Authorization Code + Implicit 혼합 방식)

3. OIDC 동작 원리

1) 클라이언트가 인증 요청

  • 클라이언트 애플리케이션이 인증을 요청합니다.
    • URL 예시:
      GET /authorize?response_type=code
                   &client_id=client
                   &redirect_uri=https://app.com/callback
                   &scope=openid profile email
                   &state=abc123
                   &nonce=xyz456

2) 사용자가 인증

  • 사용자는 인증 서버(OpenID Provider, OP)에서 로그인합니다.

3) Authorization Code 발급

  • 인증 서버는 Authorization Code를 클라이언트에게 반환합니다.

4) Access Token 및 ID Token 발급

  • 클라이언트는 Authorization Code를 사용해 Token Endpoint에서 Access Token과 ID Token을 요청합니다.
    • 요청:
      POST /token
      Content-Type: application/x-www-form-urlencoded
      grant_type=authorization_code
      code=xyz123
      client_id=client
      client_secret=secret
      redirect_uri=https://app.com/callback

5) ID Token 검증 및 사용자 정보 활용

  • 클라이언트는 받은 ID Token을 검증하여 사용자를 식별하고 세션을 생성합니다.
  • 필요시 UserInfo Endpoint를 통해 추가 정보를 가져옵니다.

4. 주요 구성 요소

a. ID Token

  • JWT 형식으로 발급되며, 인증된 사용자 정보를 포함합니다.
  • 포함 정보 예시:
    {
      "iss": "https://example.com",  // 발급자 (Issuer)
      "sub": "1234567890",          // 사용자 ID (Subject)
      "aud": "client",              // 클라이언트 ID (Audience)
      "exp": 1516239022,            // 만료 시간 (Expiration)
      "iat": 1516239022,            // 발급 시간 (Issued At)
      "email": "user@example.com",  // 추가 사용자 정보 (클레임)
    }

b. UserInfo Endpoint

  • 사용자의 추가 정보를 얻기 위한 REST API.
  • Access Token을 통해 호출 가능.
    • 요청:
      GET /userinfo
      Authorization: Bearer <access_token>
    • 응답:
      {
        "sub": "1234567890",
        "name": "John Doe",
        "email": "johndoe@example.com"
      }

5. OIDC의 주요 사용 사례

  1. 싱글 사인온(SSO):

    • 한 번 로그인하면 여러 애플리케이션에 자동으로 로그인됩니다.
  2. 소셜 로그인:

    • Google, Facebook, GitHub 등의 OpenID Connect 기반 로그인.
  3. 분산 인증 시스템:

    • 마이크로서비스 환경에서 인증과 권한 부여를 중앙 집중화.

6. OIDC의 장점

  1. OAuth 2.0과의 통합:

    • OIDC는 OAuth 2.0 위에 구축되어 인증과 권한 부여를 통합적으로 처리합니다.
  2. 표준화된 인증:

    • 클라이언트가 발급받는 ID TokenUserInfo Endpoint는 표준화된 형식입니다.
  3. 확장성:

    • 다양한 추가 정보를 클레임(Claims) 형태로 확장할 수 있습니다.
  4. 보안 강화:

    • nonce, state 등을 통해 CSRF 및 Replay 공격 방지.

7. OpenID Connect와 OAuth 2.0의 차이

기능 OAuth 2.0 OpenID Connect
목적 권한 부여 (Authorization) 인증 (Authentication)
주요 토큰 Access Token ID Token (JWT 형식)
사용자 정보 직접 포함하지 않음 ID Token 및 UserInfo Endpoint
사용 사례 API 호출 권한 관리 사용자 인증, SSO, 로그인

8. OIDC와 Spring Security

Spring Security는 OIDC를 쉽게 통합할 수 있는 기본 설정을 제공합니다.

Spring Boot OIDC 설정 예시

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-client-id
            client-secret: your-client-secret
            scope: openid, profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
        provider:
          google:
            issuer-uri: https://accounts.google.com

Spring Security는 자동으로 OIDC 플로우를 처리하며, ID Token 및 Access Token을 쉽게 활용할 수 있도록 지원합니다.


결론

  • OpenID Connect (OIDC)는 OAuth 2.0을 기반으로 사용자 인증(Authentication)을 처리하는 표준 프로토콜입니다.
  • ID Token을 통해 인증 정보를 제공하며, 주로 싱글 사인온(SSO), 소셜 로그인 등에 사용됩니다.
  • Spring Security와의 통합을 통해 쉽게 사용할 수 있으며, 현대적인 인증 시스템을 구축하는 데 널리 사용됩니다.