옴니오스(Omniauth)와 함께 알아보는 인증/인가 프로토콜 (OAuth 2.0 및 OpenID Connect)

OmniAuthから学ぶOAuth 2.0 / ykpythemind - Kaigi on Rails 2024

3줄 요약

  • Ruby on Rails의 Omniauth 젬은 웹 애플리케이션의 인증/인가 구현을 표준화하고 간소화합니다.
  • Omniauth는 내부적으로 OAuth 2.0(인가) 및 OpenID Connect(인증) 프로토콜을 활용하며 복잡한 절차를 추상화합니다.
  • Omniauth의 추상화된 기능 뒤에 있는 표준 프로토콜의 동작 방식을 이해하는 것은 디버깅 및 문제 해결에 필수적입니다.

본 발표는 Ruby on Rails 환경에서 외부 인증/인가를 손쉽게 구현하게 해주는 Omniauth 젬의 내부 동작 원리를 탐구합니다. 특히, Omniauth가 추상화하고 있는 OAuth 2.0 및 OpenID Connect 프로토콜에 대한 이해를 높이는 것을 목표로 합니다. 인증과 인가의 기본적인 개념을 명확히 하고, Omniauth를 사용한 간편한 구현 예시를 제시합니다.

인증은 사용자가 누구인지 식별하는 과정(예: 신분증 확인)이며, 인가는 특정 리소스에 접근할 수 있는 권한을 부여하는 과정(예: 티켓 소지 여부 확인)입니다. Ruby on Rails에서는 has_secure_password 등으로 자체 인증을 구현하거나, CanCanCan, Pundit 같은 젬으로 인가를 관리할 수 있습니다. 그러나 Google 로그인과 같은 외부 서비스 연동 시에는 OAuth 2.0 및 OpenID Connect와 같은 표준 프로토콜이 필요하며, Omniauth가 이를 효과적으로 지원합니다.

Omniauth를 사용하면 Google Cloud Console 설정(클라이언트 ID, 시크릿 발급 등) 후 간단한 코드 설정만으로 Google 로그인을 구현할 수 있습니다. Omniauth는 내부적으로 인증 코드 플로우(Authorization Code Flow)를 따릅니다. 이 플로우는 크게 세 단계로 진행됩니다. 첫째, 클라이언트(애플리케이션)가 ID 공급자(Google)에게 인증 요청을 보내 사용자를 ID 공급자의 인증 페이지로 리다이렉트합니다. 둘째, 사용자가 인증 및 권한 부여를 마치면 ID 공급자는 인증 코드(Authorization Code)를 포함한 응답과 함께 클라이언트의 콜백 URL로 리다이렉트합니다. 셋째, 클라이언트는 이 인증 코드를 사용하여 ID 공급자에게 토큰 요청을 보내고, ID 토큰(ID Token)과 액세스 토큰(Access Token)을 받습니다.

여기서 중요한 것은 ID 토큰과 액세스 토큰의 역할 구분입니다. ID 토큰은 OpenID Connect의 핵심으로, 사용자가 인증되었음을 증명하는 JWT(JSON Web Token) 형태입니다. 이 토큰을 검증하여 사용자의 신원을 확인합니다. ID 토큰에는 사용자 고유 식별자(sub 클레임) 등이 포함됩니다. 반면, 액세스 토큰은 OAuth 2.0의 핵심으로, 인가된 리소스(예: Google 사용자 정보 API)에 접근할 때 사용하는 토큰입니다.

Omniauth는 이러한 복잡한 플로우를 request phasecallback phase로 추상화하고, 인증 결과를 omniauth.auth라는 통일된 형태로 제공합니다. 하지만 내부적으로 어떻게 동작하는지 이해하기 위해 Omniauth 없이 직접 프로토콜 플로우를 구현하는 과정을 살펴볼 수 있습니다. 이는 디버깅이나 문제 발생 시 원인 파악에 큰 도움이 됩니다. 직접 구현 시에는 인증 요청 URL 구성, 인증 코드 수신, 토큰 엔드포인트로의 POST 요청, ID 토큰 검증 및 액세스 토큰을 이용한 사용자 정보 획득 등의 과정을 거칩니다.

결론적으로 Omniauth는 외부 서비스 연동 인증/인가 구현의 복잡성을 크게 줄여주는 강력한 젬입니다. 그러나 이 젬이 내부적으로 활용하는 OAuth 2.0 및 OpenID Connect 프로토콜, 그리고 인증 코드 플로우와 토큰(ID 토큰, 액세스 토큰)의 역할을 이해하는 것은 애플리케이션 개발 및 운영에 있어 매우 중요합니다. 이러한 지식은 특히 테스트 모드 활용, 동적 설정 변경(setup phase), 사용자 인증과 인가 구분 등 Omniauth의 고급 기능을 효과적으로 사용하고, 문제 발생 시 신속하게 대응하는 데 필수적입니다.