OAuth2 vs OpenID Connect: 차이점은 무엇인가?
Source: Dev.to

OAuth2가 실제로 무엇인지
OAuth2는 인증 프레임워크가 아니라 인가 프레임워크입니다. 사용자의 자격 증명(credential)을 공유하지 않고 애플리케이션이 사용자를 대신해 리소스에 접근할 수 있게 해줍니다. 사용자 이름과 비밀번호를 모든 서비스에 보내는 대신, 클라이언트는 **인증 서버(Authorization Server)**가 발행한 **액세스 토큰(access token)**을 받습니다. 그 토큰을 사용해 **리소스 서버(Resource Server)**에 리소스를 요청할 수 있습니다.
예시 시나리오
사용자가 제3자 애플리케이션이 다른 서비스에 저장된 자신의 데이터를 접근하도록 허용합니다. OAuth2는 이 위임을 안전하게 구현합니다.
OAuth2가 인증이 아닌 이유
많은 사람들이 OAuth2를 인증에 사용한다고 오해합니다. OAuth2는 사용자가 누구인지를 애플리케이션에 알려주지 않으며, 오직 다음 질문에 답합니다:
이 클라이언트가 이 리소스에 접근할 권한이 있는가?
액세스 토큰은 클라이언트가 권한을 가지고 있음을 증명하지만, 사용자에 대한 신뢰할 수 있는 신원 정보를 제공하지 않습니다. 이러한 제한 때문에 OAuth2만으로는 인증에 충분하지 않습니다.
OpenID Connect가 추가하는 것
OpenID Connect(OIDC)는 OAuth2 위에 구축된 레이어로, 누락된 인증 부분을 채워줍니다. OIDC는 **ID 토큰(ID Token)**이라는 새로운 토큰 유형을 도입하는데, 이 토큰에는 인증된 사용자에 대한 신원 정보가 포함됩니다. 주요 항목은 다음과 같습니다:
- 사용자 식별자(
sub) - 발급자(
iss) - 인증 시각
- 토큰 만료(
exp)
이를 통해 클라이언트 애플리케이션은 사용자가 누구인지를 확인할 수 있습니다.
| 기술 | 목적 |
|---|---|
| OAuth2 | 인가 |
| OpenID Connect | 인증 |
ID 토큰 vs 액세스 토큰
두 토큰의 차이를 이해하는 것이 중요합니다.
액세스 토큰
보호된 리소스에 접근할 때 사용됩니다.
GET /api/user-data
Authorization: Bearer <access_token>리소스 서버는 토큰을 검증하고 요청된 데이터를 반환합니다.
ID 토큰
인증된 사용자를 식별하는 데 사용됩니다. 클라이언트는 토큰을 검사해 신원 정보를 얻을 수 있습니다. 일반적인 ID 토큰 필드:
sub(사용자 식별자)iss(발급자)aud(대상)exp(만료 시간)
ID 토큰은 보통 JWT 형태로 구현됩니다.
실제 예시 흐름
단순화된 OpenID Connect 흐름은 다음과 같습니다:
- 사용자가 애플리케이션에 로그인하려고 시도합니다.
- 애플리케이션은 사용자를 인증 서버로 리다이렉트합니다.
- 사용자는 인증을 수행합니다(로그인, MFA 등).
- 인증 서버가 발행합니다:
- 액세스 토큰
- ID 토큰
- 애플리케이션은 ID 토큰을 사용해 사용자를 식별합니다.
- 액세스 토큰은 API에 데이터를 요청할 때 사용됩니다.
결론
OAuth2와 OpenID Connect는 함께 작동하지만 서로 다른 역할을 수행합니다:
- OAuth2는 인가를 제공합니다.
- OpenID Connect는 OAuth2 위에 신원 정보를 추가하여 인증을 제공합니다.
이 차이를 이해하면 개발자가 보다 안전하고 확장 가능한 인증 시스템을 설계하는 데 도움이 됩니다.
OAuth2 흐름에 대한 자세한 내용을 알고 싶다면 이전 글을 참고하세요.