OpenID vs. OpenID Connect

인증과 권한 부여는 현대 웹 애플리케이션의 핵심 보안 요소로, 다양한 표준과 프로토콜이 개발되어 왔다. 그중에서도 OpenID와 OpenID Connect는 사용자 인증을 위한 중요한 표준이다. 이 두 기술은 이름이 유사하여 혼동되기 쉽지만, 근본적인 목적과 구현 방식에는 중요한 차이점이 있다.

역사적 배경 및 발전 과정

OpenID

OpenID는 2005년 Brad Fitzpatrick가 처음 개발한 분산형 인증 프로토콜이다. 당시 인터넷은 사용자가 각 웹사이트마다 새로운 계정을 생성해야 하는 불편함이 있었고, 이를 해결하기 위해 등장했다.

OpenID의 주요 발전 단계:

  • 2005년: OpenID 1.0 발표
  • 2006년: OpenID 1.1 릴리스
  • 2007년: OpenID 2.0 표준화 - 보안 강화 및 확장성 개선
  • 2008년 이후: Google, Yahoo, Microsoft 등 주요 기업들이 OpenID 제공자로 참여

OpenID Connect

OpenID Connect는 2014년에 정식으로 표준화된 인증 프로토콜로, OpenID Foundation에서 개발했다. OpenID의 한계점을 개선하고 OAuth 2.0을 기반으로 구축되었다.

OpenID Connect의 주요 발전 단계:

  • 2010년: OpenID Foundation에서 OpenID Connect 작업 시작
  • 2011년: 초기 규격 발표
  • 2014년: OpenID Connect Core 1.0 최종 규격 발표
  • 2015년 이후: Google, Microsoft, Auth0 등이 적극적으로 채택
  • 현재: 대부분의 최신 ID 관리 시스템에서 표준으로 사용됨

기본 개념 및 작동 원리

OpenID의 작동 원리

OpenID는 사용자가 여러 웹사이트에서 동일한 디지털 ID를 사용할 수 있게 해주는 분산형 인증 프로토콜이다.

  1. 제공자 중심: 사용자는 OpenID 제공자(예: Yahoo, Google)에서 자신의 ID를 설정한다.
  2. URL 기반 식별자: 사용자의 ID는 URL 형태(예: username.myopenid.com)로 표현된다.
  3. 인증 과정:
    • 사용자가 웹사이트(RP: Relying Party)에 OpenID URL을 입력한다.
    • 웹사이트는 URL을 확인하고 해당 OpenID 제공자로 사용자를 리디렉션한다.
    • 사용자는 OpenID 제공자에 로그인한다.
    • 인증 후, 제공자는 사용자를 원래 웹사이트로 리디렉션한다.
    • 웹사이트는 인증 결과를 확인하고 사용자에게 접근 권한을 부여한다.
1
2
3
4
5
6
// OpenID 2.0 인증 요청 예시
https://openid-provider.example.com/auth?
  openid.ns=http://specs.openid.net/auth/2.0&
  openid.mode=checkid_setup&
  openid.return_to=https://relying-party.example.com/return&
  openid.realm=https://relying-party.example.com

OpenID Connect의 작동 원리

OpenID Connect는 OAuth 2.0 프로토콜 위에 구축된 ID 계층으로, 인증과 기본적인 사용자 정보를 제공한다.

  1. OAuth 2.0 기반: 인증뿐만 아니라 권한 부여도 처리할 수 있다.
  2. JWT 토큰 사용: JSON Web Token을 사용하여 인증 정보와 클레임을 안전하게 전달한다.
  3. 인증 과정:
    • 클라이언트 애플리케이션이 사용자를 OpenID Connect 제공자(예: Google)로 리디렉션한다.
    • 사용자가 제공자에 로그인하고 권한을 부여한다.
    • 제공자는 권한 코드를 발급하고 사용자를 클라이언트로 리디렉션한다.
    • 클라이언트는 권한 코드를 사용하여 ID 토큰과 액세스 토큰을 요청한다.
    • 클라이언트는 ID 토큰을 검증하고 필요에 따라 액세스 토큰을 사용하여 추가 정보를 요청한다.
1
2
3
4
5
6
7
// OpenID Connect 인증 요청 예시
https://accounts.google.com/o/oauth2/v2/auth?
  response_type=code&
  client_id=YOUR_CLIENT_ID&
  scope=openid%20profile%20email&
  redirect_uri=https://your-app.example.com/callback&
  state=security_token%3D138r5719ru3e1%26url%3Dhttps://your-app.example.com/home

기술적 구현 및 프로토콜 비교

프로토콜 구조

  • OpenID
    • 프로토콜 구조: 독립적인 프로토콜
    • 메시지 형식: XML 기반
    • 인증 방식: 다양한 인증 방식 지원(비밀번호, 디지털 인증서 등)
    • 규격: 복잡하고 확장이 어려운 경향이 있음
  • OpenID Connect
    • 프로토콜 구조: OAuth 2.0 위에 구축된 계층
    • 메시지 형식: JSON 기반
    • 인증 방식: OAuth 2.0 인증 플로우 사용
    • 규격: 모듈화된 구조로 확장성이 우수함

인증 흐름

  • OpenID 인증 흐름
    1. 사용자가 Relying Party(RP)에 OpenID 제공자 URL을 제공
    2. RP가 제공자의 엔드포인트를 발견(Discovery)
    3. 필요시 RP와 제공자 간에 연결 설정(Association)
    4. RP가 사용자를 제공자로 리디렉션
    5. 사용자가 제공자에 인증
    6. 제공자가 사용자를 RP로 리디렉션하며 인증 응답 포함
    7. RP가 응답 검증
  • OpenID Connect 인증 흐름
    1. 클라이언트가 사용자를 OpenID Provider(OP)로 리디렉션
    2. 사용자가 OP에 인증 및 권한 부여
    3. OP가 사용자를 권한 코드와 함께 클라이언트로 리디렉션
    4. 클라이언트가 백채널을 통해 OP에 권한 코드로 토큰 요청
    5. OP가 ID 토큰과 액세스 토큰 발급
    6. 클라이언트가 토큰 검증 및 사용자 인증 완료
    7. 선택적으로 UserInfo 엔드포인트에서 추가 정보 획득

토큰 및 보안

  • OpenID
    • 인증 증명: 서명된 어설션(assertion) 사용
    • 프로토콜 보안: 연결 설정 시 DH(Diffie-Hellman) 키 교환 사용
    • 확장성: Simple Registration(SREG), Attribute Exchange(AX) 확장을 통한 사용자 정보 교환
  • OpenID Connect
    • 토큰 유형:
      • ID 토큰: 사용자 인증 정보를 포함한 JWT
      • 액세스 토큰: API 접근을 위한 OAuth 2.0 토큰
      • 리프레시 토큰: 새로운 액세스 토큰 발급을 위한 토큰
    • 프로토콜 보안: TLS, JWT 서명 및 암호화, CSRF 방지 상태 매개변수
    • 스코프: 클라이언트가 요청할 수 있는 사용자 정보의 범위 지정 가능

주요 차이점 및 장단점

OpenID의 장단점

장점:

  • 분산형 구조로 단일 실패 지점이 없음
  • URL 기반의 직관적인 ID 체계
  • 다양한 인증 방식 지원

단점:

  • 구현이 복잡하고 개발자 친화적이지 않음
  • 모바일 환경 지원이 제한적
  • 사용자 경험이 다소 불편할 수 있음
  • 권한 부여 기능이 부족

OpenID Connect의 장단점

장점:

  • OAuth 2.0과의 통합으로 인증과 권한 부여를 동시에 처리
  • JWT 기반의 표준화된 클레임 세트
  • 개발자 친화적인 JSON 기반 프로토콜
  • 모바일 애플리케이션 지원이 우수
  • 다양한 인증 플로우 제공(Authorization Code, Implicit, Hybrid)

단점:

  • 구현 복잡성(특히 보안 측면)
  • 중앙 집중식 제공자에 대한 의존성 증가
  • OAuth 2.0의 보안 취약점을 상속할 수 있음

5. 사용 사례 및 적용 분야

OpenID 주요 사용 사례

  • 블로그, 포럼, 커뮤니티 사이트 인증
  • 단순한 SSO(Single Sign-On) 구현
  • 사용자 중심의 분산 ID 관리

OpenID Connect 주요 사용 사례

  • 엔터프라이즈 SSO 솔루션
  • 모바일 애플리케이션 인증
  • API 기반 서비스와의 통합
  • 마이크로서비스 아키텍처의 인증 및 권한 부여
  • B2B, B2C 시나리오의 사용자 관리

현재 상태 및 미래 전망

현재 상태

  • OpenID: 대부분의 주요 제공자들이 OpenID 2.0 지원을 중단했으며, 새로운 구현은 드문 상황
  • OpenID Connect: 대부분의 ID 제공자(Google, Microsoft, Okta, Auth0 등)가 지원하며 업계 표준으로 자리잡음

미래 전망

  • 분산 ID: OpenID Connect는 분산 ID 및 자체 주권 ID(Self-Sovereign Identity) 분야로 발전 중
  • FIDO 통합: 생체 인식과 같은 강력한 인증 방법과의 통합
  • IoT 인증: 사물 인터넷 기기 인증을 위한 확장
  • 암호화폐 및 블록체인 통합: 탈중앙화된 ID 관리 시스템과의 통합

OpenID와 OpenID Connect 비교

특성OpenIDOpenID Connect
출시 연도2005년2014년
기반 프로토콜독립적인 프로토콜OAuth 2.0 기반
설계 목적단순 인증(Authentication)인증 및 권한 부여(Authorization)
ID 형식URL 기반클레임 기반 JWT
데이터 형식XMLJSON
토큰 체계어설션(Assertion)JWT(ID 토큰), 액세스 토큰, 리프레시 토큰
사용자 정보 제공SREG/AX 확장을 통해 제한적표준화된 클레임 세트와 UserInfo 엔드포인트
인증 흐름단일 인증 흐름다양한 흐름(Authorization Code, Implicit, Hybrid)
모바일 지원제한적우수함
개발자 친화성복잡하고 구현이 어려움상대적으로 단순하고 문서화가 잘 되어 있음
현재 상태레거시, 대부분 서비스에서 중단됨업계 표준으로 활발히 사용 중
주요 제공자과거: Yahoo, Google, MyOpenID 등현재: Google, Microsoft, Auth0, Okta 등
확장성제한적높음(다양한 선택적 기능과 확장)
보안 특성DH 키 교환, 서명된 어설션TLS, JWT 서명 및 암호화, CSRF 방지 등
세션 관리제한적세션 관리 명세 존재
리소스 접근지원하지 않음액세스 토큰을 통해 지원
스코프 개념제한적광범위하게 지원(openid, profile, email 등)
Discovery 메커니즘XRDS 문서JSON 기반 OpenID Connect Discovery
활용 사례단순 웹사이트 로그인웹, 모바일, API, 엔터프라이즈 SSO

구현 예제 비교

OpenID 구현 예제

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# OpenID 2.0 구현 예제 (Python)
from openid.consumer import consumer
from openid.store import memstore

# 메모리 기반 저장소 생성
store = memstore.MemoryStore()
oidconsumer = consumer.Consumer(session, store)

# OpenID 인증 시작
def begin_openid():
    openid_url = request.form.get('openid_identifier')
    try:
        auth_request = oidconsumer.begin(openid_url)
        # 추가 정보 요청 (Simple Registration 확장 사용)
        from openid.extensions import sreg
        sreg_request = sreg.SRegRequest(required=['nickname', 'email'])
        auth_request.addExtension(sreg_request)
        
        # 인증 URL로 리디렉션
        redirect_url = auth_request.redirectURL(
            return_to='http://example.com/openid/complete',
            realm='http://example.com'
        )
        return redirect(redirect_url)
    except Exception as e:
        return "OpenID 인증 시작 실패: " + str(e)

# OpenID 인증 완료
def complete_openid():
    current_url = request.url
    try:
        response = oidconsumer.complete(request.args, current_url)
        if response.status == consumer.SUCCESS:
            # 인증 성공
            from openid.extensions import sreg
            sreg_response = sreg.SRegResponse.fromSuccessResponse(response)
            user_data = sreg_response.get_data()
            return "인증 성공! 사용자: " + user_data.get('nickname')
        else:
            return "인증 실패"
    except Exception as e:
        return "OpenID 인증 완료 처리 실패: " + str(e)

OpenID Connect 구현 예제

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# OpenID Connect 구현 예제 (Python)
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
oauth = OAuth(app)

# OpenID Connect 제공자 설정
oauth.register(
    name='google',
    server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
    client_id='YOUR_CLIENT_ID',
    client_secret='YOUR_CLIENT_SECRET',
    client_kwargs={'scope': 'openid email profile'}
)

# 인증 시작
@app.route('/login')
def login():
    redirect_uri = url_for('auth', _external=True)
    return oauth.google.authorize_redirect(redirect_uri)

# 콜백 처리
@app.route('/auth')
def auth():
    token = oauth.google.authorize_access_token()
    # ID 토큰에서 사용자 정보 추출
    user_info = oauth.google.parse_id_token(token)
    session['user'] = user_info
    return redirect('/')

# 사용자 정보 엔드포인트 접근
@app.route('/userinfo')
def get_user_info():
    token = session.get('token')
    resp = oauth.google.get('userinfo', token=token)
    return jsonify(resp.json())

용어 정리

용어설명

참고 및 출처