Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

OAuth (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.14 23:11

OAuth

이름

OAuth

분류

인증 및 권한 부여 프로토콜

개발

2006년 시작, OAuth 1.0 2010년, OAuth 2.0 2012년

주요 기능

제3자 애플리케이션에 대한 안전한 API 접근 권한 위임

현재 버전

OAuth 2.0 (RFC 6749)

관련 표준

OpenID Connect (OIDC)

기술 상세 정보

목적

사용자가 비밀번호를 공유하지 않고도 제3자 애플리케이션에 자신의 자원에 대한 제한된 접근 권한을 부여할 수 있도록 함

핵심 구성 요소

리소스 오너, 클라이언트, 리소스 서버, 인증 서버

권한 부여 유형

인증 코드, 암시적, 리소스 소유자 비밀번호 자격 증명, 클라이언트 자격 증명

토큰 종류

액세스 토큰, 리프레시 토큰

보안

HTTPS 사용, 토큰 기반, CSRF 방지

OAuth 1.0 vs 2.0

1.0은 서명 복잡, 2.0은 HTTPS 의존, 간소화

사용 예시

"Google로 로그인", "Facebook으로 공유"

단점/비판

구현 복잡성, 2.0의 보안 의존성, 잘못된 구현 시 취약점

확장

OAuth 2.0 보안 최상의 실천 방법 (RFC 6819), JWT (JSON Web Token)

관련 기술

SAML, OpenID, API 게이트웨이

1. 개요

OAuth는 인터넷 사용자가 비밀번호를 제공하지 않고도 제3의 애플리케이션이 특정 웹 서비스의 자원에 접근할 수 있도록 권한을 위임하는 개방형 표준 프로토콜이다. 주로 API 접근 권한을 안전하게 관리하기 위해 사용된다. 예를 들어, 사용자가 소셜 미디어 계정으로 다른 웹사이트에 로그인하거나, 캘린더 애플리케이션이 사용자의 이메일 계정에서 일정을 가져오는 경우에 OAuth가 작동한다.

이 프로토콜의 핵심은 액세스 토큰이라는 개념이다. 사용자는 자신의 자격 증명(아이디와 비밀번호)을 제3자 애플리케이션에 직접 제공하는 대신, 권한 서버로부터 발급받은 액세스 토큰을 애플리케이션에 전달한다. 이 토큰은 특정 범위와 기간 동안만 유효하며, 사용자는 토큰이 접근할 수 있는 자원의 범위를 세부적으로 제어할 수 있다.

OAuth는 2006년 트위터 개발자들이 초기 아이디어를 제안했으며, 2010년 IETF(국제 인터넷 표준화 기구)에서 OAuth 1.0 프로토콜이 표준으로 발표되었다. 이후 보다 광범위한 적용과 단순화를 목표로 2012년에 OAuth 2.0 프레임워크가 발표되었다. OAuth 2.0은 현재 웹 애플리케이션, 모바일 앱, 데스크톱 애플리케이션 등 다양한 클라이언트 환경에서 가장 널리 채택된 인가 프레임워크이다.

OAuth는 인증(Authentication)과 인가(Authorization)를 구분한다는 점이 중요하다. OAuth 자체는 주로 '인가'에 초점을 맞추어, 클라이언트가 보호된 자원에 접근할 권한을 얻는 과정을 표준화한다. 사용자의 신원을 확인하는 '인증' 기능은 OpenID Connect와 같은 별도의 레이어에서 확장하여 제공된다.

2. 역사와 배경

OAuth의 개발은 웹 서비스 간의 안전한 위임 접근에 대한 필요성에서 비롯되었다. 2006년 당시, 사용자가 한 서비스(예: 인쇄 서비스)에 자신의 다른 서비스(예: 플리커 사진 계정) 데이터에 대한 접근 권한을 부여하는 표준화된 방법이 부재했다. 일반적인 방식은 사용자가 플리커의 아이디와 비밀번호를 인쇄 서비스에 직접 제공하는 것이었는데, 이는 여러 보안 및 신뢰 문제를 야기했다[1].

이 문제를 해결하기 위해 트위터의 개발자 블레인 쿡과 마운틴뷰의 크리스 메신저를 포함한 소규모 그룹이 2006년 11월 초기 논의를 시작했다. 그들은 사용자가 비밀번호를 공유하지 않고도 제3자 애플리케이션에 자신의 데이터에 대한 제한된 접근 권한을 안전하게 위임할 수 있는 개방형 프로토콜을 설계하기로 합의했다. 이 작업은 2007년 4월 공식적으로 시작되어, 구글, 야후! 등 여러 회사의 개발자들이 참여하는 커뮤니티 주도 프로젝트로 성장했다.

OAuth 1.0 프로토콜 사양의 초안은 2007년 7월에 작성되었으며, 2007년 10월 3일 최종 초안이 발표되었다. 이후 광범위한 검토와 구현을 거쳐, 2010년 4월 IETF(국제 인터넷 표준화 기구)에 의해 공식 표준(RFC 5849)으로 발표되었다. 그러나 OAuth 1.0은 구현이 복잡하고 모바일 애플리케이션 또는 자바스크립트 기반 클라이언트와 같은 현대적인 사용 사례에 완전히 적합하지 않다는 비판을 받았다.

이러한 한계를 해결하기 위해 OAuth 2.0 프레임워크에 대한 작업이 2010년에 시작되었다. OAuth 2.0은 프로토콜이 아닌 프레임워크로 설계되어, 다양한 유형의 클라이언트(웹, 모바일, 데스크톱)와 환경에 맞는 확장 가능한 권한 부여 방법을 제공하는 데 중점을 두었다. OAuth 2.0 핵심 사양은 2012년 10월 IETF RFC 6749(권한 부여)와 RFC 6750(토큰 사용)으로 공표되었다. OAuth 2.0은 이전 버전과 호환되지 않지만, 더 넓은 적용 범위와 더 쉬운 구현으로 인해 산업계의 사실상(de facto) 표준이 되었다.

3. 핵심 개념

OAuth의 핵심 개념은 네 가지 주요 역할과 토큰, 권한 부여 방식을 중심으로 정의된다. 이 구조는 리소스 소유자가 자신의 데이터에 대한 접근 권한을 제삼자 클라이언트 애플리케이션에 안전하게 위임할 수 있도록 설계되었다.

주요 역할은 다음과 같다.

* 리소스 소유자: 보호된 자원(예: 사진, 연락처 목록)의 소유자이자, 클라이언트에게 해당 자원 접근을 허가할 수 있는 주체이다. 일반적으로 최종 사용자를 의미한다.

* 클라이언트: 리소스 소유자를 대신하여 보호된 자원에 접근을 요청하는 애플리케이션이다. 웹 서버 애플리케이션, 단일 페이지 애플리케이션(SPA), 모바일 앱 등이 해당된다.

* 인증 서버: 리소스 소유자를 성공적으로 인증한 후, 클라이언트에게 액세스 토큰을 발급하는 서버이다. 이 서버는 권한 부여를 관리하는 핵심 구성 요소이다.

* 리소스 서버: 보호된 자원을 호스팅하고, 유효한 액세스 토큰을 제시하는 요청을 수락하여 자원을 제공하는 서버이다.

권한 부여 과정의 핵심 매개체는 토큰이다. 액세스 토큰은 클라이언트가 리소스 서버에 접근할 때 사용하는 자격 증명으로, 특정 범위와 수명을 가진다. 리프레시 토큰은 액세스 토큰의 수명이 만료되었을 때, 사용자의 재인증 없이 새로운 액세스 토큰을 얻는 데 사용된다. 리프레시 토큰은 액세스 토큰보다 수명이 길며, 보안상 더 엄격하게 보호되어야 한다.

클라이언트가 액세스 토큰을 얻기 위해 사용하는 자격 증명을 권한 부여라고 한다. OAuth 2.0은 다양한 사용 사례에 맞춰 여러 권한 부여 유형을 정의한다. 가장 일반적인 유형은 권한 부여 코드이다. 이 방식에서 클라이언트는 먼저 사용자를 인증 서버로 리디렉션하여 권한을 부여받고, 임시 코드를 획득한 후, 이 코드를 백엔드 서버에서 액세스 토큰으로 교환한다. 이는 높은 보안성을 제공하는 표준 방식이다. 다른 유형으로는 클라이언트 자체의 자격 증명을 사용하는 클라이언트 자격 증명이나, 사용자의 아이디와 비밀번호를 직접 전달하는 리소스 소유자 패스워드 자격 증명 등이 있다.

3.1. 역할 (Resource Owner, Client, Authorization Server, Resource Server)

OAuth 프레임워크는 네 가지 주요 역할을 정의하여 인증 및 권한 부여 흐름에서 각자의 책임을 명확히 구분한다.

첫 번째 역할은 리소스 오너(Resource Owner)이다. 이는 보호된 자원(예: 사용자의 계정 정보, 사진, 연락처 등)에 대한 접근 권한을 부여할 수 있는 주체를 의미한다. 일반적으로 최종 사용자인 사용자(End-User)가 이 역할을 수행한다. 리소스 오너는 클라이언트 애플리케이션이 자신의 자원에 접근하는 것을 허용하거나 거부할 최종 결정권을 가진다.

나머지 세 역할은 서비스 제공 측면에 속한다. 클라이언트(Client)는 리소스 오너를 대신하여 보호된 자원에 접근을 요청하는 애플리케이션이다. 웹 애플리케이션, 모바일 앱, 데스크톱 애플리케이션 등이 여기에 해당한다. 인증 서버(Authorization Server)는 리소스 오너의 인증을 확인하고, 클라이언트에게 접근 권한을 나타내는 액세스 토큰을 발급하는 서버이다. 마지막으로 리소스 서버(Resource Server)는 보호된 자원을 호스팅하고, 유효한 액세스 토큰을 제시하는 요청을 수락하여 해당 자원을 제공하는 서버이다.

역할 (영문)

설명

일반적인 예시

리소스 오너 (Resource Owner)

보호된 자원의 소유자. 접근 권한을 부여할 수 있는 주체.

서비스의 최종 사용자

클라이언트 (Client)

리소스 오너를 대신하여 보호된 자원에 접근을 요청하는 애플리케이션.

소셜 미디어 연동 기능이 있는 웹사이트, 모바일 앱

인증 서버 (Authorization Server)

리소스 오너를 인증하고, 클라이언트에게 액세스 토큰을 발급하는 서버.

Google의 OAuth 2.0 서버, GitHub의 인증 서버

리소스 서버 (Resource Server)

보호된 자원을 보유하고, 액세스 토큰의 유효성을 검사하여 자원을 제공하는 서버.

사용자의 프로필 정보를 제공하는 Google API 서버

인증 서버와 리소스 서버는 물리적으로 같은 서버에 위치할 수도 있고, 확장성과 보안을 위해 분리되어 구성될 수도 있다. 이 네 가지 역할의 상호작용을 통해 리소스 오너의 비밀번호를 클라이언트에게 직접 노출시키지 않으면서도 안전하게 위임된 접근 권한을 부여하는 위임 접근(Delegated Access)이 가능해진다.

3.2. 토큰 (Access Token, Refresh Token)

OAuth 2.0 프레임워크의 핵심은 액세스 토큰과 리프레시 토큰이라는 두 가지 주요 토큰을 사용하여 리소스 서버에 대한 접근을 위임하고 관리하는 것이다.

액세스 토큰은 클라이언트가 보호된 리소스에 접근할 수 있도록 허용하는 자격 증명이다. 이 토큰은 일반적으로 JWT 형식이나 불투명한 문자열로 발급되며, 리소스 서버에 제출되어 요청의 인가를 증명한다. 액세스 토큰에는 권한 범위(스코프), 유효 기간, 클라이언트 식별자 등의 정보가 포함될 수 있다. 보안상의 이유로 액세스 토큰의 수명은 비교적 짧게 설정되는 것이 일반적이다[2].

토큰 종류

주된 용도

수명

보안 특성

액세스 토큰

리소스 서버에 대한 API 호출 인가

짧음

탈취 시 위험도 높음

리프레시 토큰

새로운 액세스 토큰 발급

길거나 영구적

높은 보안으로 보호 필요

리프레시 토큰은 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 얻는 데 사용되는 자격 증명이다. 사용자가 매번 재인증하지 않고도 지속적인 접근을 가능하게 한다. 리프레시 토큰은 액세스 토큰보다 훨씬 긴 수명을 가지며, 클라이언트에 안전하게 저장되어야 한다. 이 토큰이 탈취되면 공격자가 장기간 새로운 액세스 토큰을 발급받을 수 있으므로, 인가 서버는 리프레시 토큰의 사용을 모니터링하고 취소할 수 있는 메커니즘을 제공한다.

3.3. 권한 부여 (Authorization Grant)

권한 부여는 클라이언트 애플리케이션이 사용자의 리소스에 접근할 수 있는 권한을 얻기 위해 사용하는 자격 증명 또는 메커니즘을 의미한다. OAuth 2.0 프레임워크에서 클라이언트는 이 권한 부여를 획득하여 액세스 토큰을 교환한다. 권한 부여의 구체적인 형태는 클라이언트의 유형과 요구사항에 따라 달라지며, 이를 권한 부여 유형이라고 부른다.

주요 권한 부여 유형은 다음과 같다.

권한 부여 유형

설명

주요 사용 사례

Authorization Code Grant

인가 서버가 클라이언트에 인가 코드를 발급하고, 클라이언트는 이 코드로 액세스 토큰을 교환한다.

서버 기반 웹 애플리케이션. 가장 안전하고 일반적인 흐름이다.

Implicit Grant

인가 코드 교환 단계 없이 직접 액세스 토큰을 발급받는다.

브라우저 내에서 실행되는 자바스크립트 애플리케이션[3].

Resource Owner Password Credentials Grant

사용자의 아이디와 비밀번호를 직접 클라이언트가 인가 서버에 제시하여 토큰을 획득한다.

신뢰할 수 있는 클라이언트(예: 공식 모바일 앱)에서만 제한적으로 사용한다.

Client Credentials Grant

클라이언트 자신의 자격 증명으로 액세스 토큰을 발급받는다. 사용자 대신 클라이언트 자체의 리소스에 접근할 때 사용한다.

백엔드 간 API 호출, 마이크로서비스 통신.

Device Code Grant

입력 장치가 제한된 장치(예: 스마트 TV)에서 사용자 인증을 위해 별도의 기기(예: 스마트폰)를 활용하는 흐름이다.

IoT 기기, 스마트 TV 애플리케이션.

권한 부여 과정의 핵심은 리소스 오너가 클라이언트에게 자신의 리소스에 대한 제한된 접근 권한을 위임하는 것이다. 클라이언트는 선택한 권한 부여 유형에 따라 정의된 프로토콜을 정확히 따라야 하며, 획득한 권한 부여(예: 인가 코드)는 반드시 사전에 등록된 리디렉션 URI로만 전송되어야 한다. 이는 보안을 유지하는 중요한 요소이다.

4. 권한 부여 유형 (Grant Types)

OAuth 2.0은 다양한 애플리케이션 유형과 신뢰 수준에 맞춰 여러 권한 부여 유형을 정의한다. 이 유형들은 클라이언트가 액세스 토큰을 얻기 위해 사용하는 인증 흐름을 결정하며, 공식적으로는 권한 부여 허가 유형이라고 부른다. 각 유형은 특정 사용 사례와 클라이언트의 보안 능력에 최적화되어 있다.

주요 권한 부여 유형은 다음과 같다.

유형

설명

주요 사용 사례

Authorization Code Grant

가장 안전하고 일반적인 흐름. 클라이언트가 사용자를 인증 서버로 리디렉션하여 인증한 후, 권한 코드를 받아 백엔드에서 토큰으로 교환한다.

서버 측에서 실행되는 웹 애플리케이션, 모바일 앱, 단일 페이지 애플리케이션(SPA).

Implicit Grant

권한 코드 단계를 생략하고 액세스 토큰을 바로 반환한다. 보안상 취약점이 있어 현대 보안 가이드에서는 사용을 권장하지 않는다.

과거의 브라우저 기반 자바스크립트 애플리케이션(현재는 Authorization Code Grant with PKCE로 대체됨).

Resource Owner Password Credentials Grant

사용자가 클라이언트에 직접 자신의 아이디와 비밀번호를 제공하면, 클라이언트가 이를 사용해 토큰을 요청한다. 신뢰할 수 있는 클라이언트에만 제한적으로 사용해야 한다.

공식적인 첫 파티 애플리케이션(예: 회사의 모바일 앱), 레거시 시스템 마이그레이션.

Client Credentials Grant

사용자 대신 클라이언트 자신의 신원을 인증한다. 클라이언트 자체가 보호된 리소스에 접근해야 할 때 사용한다.

백엔드 간 통신, 마이크로서비스 API 호출, 자동화된 작업.

Device Code Grant

입력 장치가 제한된 장치(예: 스마트 TV, IoT 기기)용 흐름이다. 사용자에게 다른 기기(예: 스마트폰)에서 확인할 수 있는 코드와 URL을 제공한다.

스마트 TV 앱, 프린터, 셋톱박스와 같은 입력 제한 장치.

Authorization Code Grant는 보안이 가장 강력한 표준 흐름으로 간주되며, 특히 Authorization Code Grant with PKCE 확장은 공개 클라이언트(모바일 앱, SPA)의 보안을 강화한다. 반면, Implicit Grant는 토큰이 브라우저 히스토리나 로그에 노출될 위험이 있어 OAuth 2.1 명세에서는 제외되었다. 적절한 권한 부여 유형을 선택하는 것은 애플리케이션의 아키텍처와 보안 요구사항을 충족시키는 데 필수적이다.

4.1. Authorization Code Grant

Authorization Code Grant는 OAuth 2.0에서 가장 일반적이고 안전하게 사용되는 권한 부여 유형이다. 이 방식은 클라이언트가 사용자 에이전트(일반적으로 웹 브라우저)를 통해 인증 서버로 리디렉션하여 사용자 인증을 수행한 후, 권한 부여 코드를 받아 다시 액세스 토큰으로 교환하는 두 단계의 흐름을 가진다. 이는 클라이언트가 사용자의 자격 증명을 직접 처리하지 않으며, 액세스 토큰이 사용자 에이전트를 거치지 않고 백채널로 전달되기 때문에 보안성이 높다.

전형적인 흐름은 다음과 같은 단계로 이루어진다.

1. 클라이언트는 사용자를 인증 서버의 권한 부여 엔드포인트로 리디렉션한다. 이때 요청에는 response_type=code, 클라이언트 식별자, 리디렉션 URI, 요청된 권한 범위(Scope) 등이 포함된다.

2. 사용자는 인증 서버에서 인증을 완료하고 클라이언트에게 권한을 부여한다.

3. 인증 서버는 사용자 에이전트를 사전에 등록된 리디렉션 URI로 돌려보내며, 요청 파라미터에 권한 부여 코드를 첨부한다.

4. 클라이언트는 이 권한 부여 코드를 사용하여 인증 서버의 토큰 엔드포인트에 직접 요청을 보낸다. 이 요청에는 코드, 리디렉션 URI, 클라이언트 자격 증명(클라이언트 비밀 등)이 포함된다.

5. 인증 서버는 코드를 검증한 후, 액세스 토큰(및 선택적으로 리프레시 토큰)을 클라이언트에게 직접 응답한다.

이 유형은 클라이언트 비밀을 안전하게 저장하고 유지할 수 있는 웹 애플리케이션 서버나 모바일 앱과 같은 기밀 클라이언트에 적합하다. 권한 부여 코드 자체는 액세스 토큰이 아니므로, 중간에 탈취되더라도 클라이언트 자격 증명 없이는 토큰으로 교환할 수 없다는 점이 핵심 보안 장점이다. 또한, Proof Key for Code Exchange 확장을 함께 사용하면 공개 클라이언트(예: 단일 페이지 애플리케이션, 네이티브 앱)에서도 코드 교환 과정을 보호할 수 있어 현대적인 보안 표준으로 권장된다.

4.2. Implicit Grant

Implicit Grant는 OAuth 2.0의 권한 부여 유형 중 하나로, 주로 클라이언트가 공개된 환경(예: 자바스크립트 기반 싱글 페이지 애플리케이션)에서 실행될 때 사용된다. 이 유형은 Authorization Code Grant와 달리 중간 단계인 '인가 코드' 교환 없이, 인증 서버가 직접 클라이언트에게 액세스 토큰을 발급한다는 특징이 있다.

인증 흐름은 다음과 같다. 먼저, 클라이언트는 리소스 오너를 인증 서버의 인증 페이지로 리디렉션한다. 리소스 오너가 로그인하고 권한을 승인하면, 인증 서버는 액세스 토큰을 URL의 프래그먼트(#) 부분에 담아 클라이언트로 리디렉션한다. 클라이언트는 자바스크립트 등을 통해 이 토큰을 추출하여 리소스 서버에 접근하는 데 사용한다. 리프레시 토큰은 이 흐름에서 발급되지 않는다.

특징

설명

주요 사용처

브라우저 내 실행되는 공개 클라이언트 (SPA)

토큰 발급 위치

인증 서버 → 클라이언트 (직접)

사용되는 토큰

액세스 토큰만

보안 고려사항

토큰이 브라우저 히스토리나 로그에 노출될 위험이 있음

이 방식은 구조가 단순하고 추가적인 백엔드 호출이 필요 없다는 장점이 있지만, 액세스 토큰이 브라우저에 직접 노출되어 토큰 탈취 등의 보안 위험에 더 취약하다. 이러한 보안 문제로 인해, 최신 보안 권고에서는 공개 클라이언트에도 Authorization Code Grant와 PKCE 확장을 함께 사용하는 것을 더 권장한다[4].

4.3. Resource Owner Password Credentials Grant

Resource Owner Password Credentials Grant는 사용자가 자신의 자격 증명(사용자명과 비밀번호)을 직접 클라이언트 애플리케이션에 제공하여 액세스 토큰을 얻는 권한 부여 유형이다. 이 방식은 주로 클라이언트 애플리케이션을 사용자 측에서 높은 신뢰를 할 수 있을 때, 예를 들어 같은 조직에서 개발한 공식 애플리케이션이나 기기의 운영 체제 자체 애플리케이션 등에서 사용된다. 사용자가 자신의 비밀번호를 직접 입력해야 하므로, 일반적인 권한 부여 코드 부여(Authorization Code Grant) 방식보다 보안 위험이 높은 것으로 간주된다.

이 흐름은 OAuth의 다른 유형들과 달리, 사용자의 동의를 묻는 별도의 인증 서버 리디렉션 단계를 생략한다. 대신 클라이언트는 사용자로부터 받은 자격 증명을 직접 인증 서버의 토큰 엔드포인트로 전송한다. 인증 서버는 이를 검증한 후, 액세스 토큰(및 선택적으로 리프레시 토큰)을 클라이언트에게 직접 발급한다. 이 과정은 일반적으로 단일 HTTP 요청-응답으로 완료된다.

이 방식을 사용하는 경우는 매우 제한적이며, 다음과 같은 조건이 권장된다.

  • 클라이언트 애플리케이션이 사용자에게 완전히 신뢰받는 경우(예: 서비스 제공자가 공식적으로 배포한 애플리케이션).

  • 다른 권한 부여 유형(예: 권한 부여 코드 부여 또는 기기 코드 부여)을 구현할 수 없는 경우.

  • 높은 수준의 보안 채널(예: 전송 계층 보안(TLS))을 통해 자격 증명이 전송되는 경우.

장점

단점 및 위험

구현이 간단하고 직관적이다.

사용자의 비밀번호가 클라이언트 애플리케이션에 노출되어 피싱 공격에 취약해질 수 있다.

브라우저 리디렉션이 필요 없어 네이티브 애플리케이션에 적합할 수 있다.

클라이언트가 사용자 비밀번호를 저장할 유인이 생겨 보안 사고 위험이 증가한다.

사용자가 OAuth의 핵심 원칙 중 하나인 '자격 증명을 제3자와 공유하지 않음'을 위반하게 한다.

따라서 OAuth 2.0 공식 명세에서는 이 방식을 다른 모든 대안이 실현 불가능할 때의 최후의 수단으로만 사용할 것을 강력히 권고한다. 많은 주요 인증 서버 제공자들은 보안 정책을 강화하기 위해 이 흐름의 사용을 기본적으로 비활성화하거나 제한하는 경우가 많다.

4.4. Client Credentials Grant

Client Credentials Grant는 클라이언트 애플리케이션이 자신의 신원을 인증하여 액세스 토큰을 직접 획득하는 권한 부여 유형이다. 이 방식은 사용자(리소스 소유자)의 개입 없이, 클라이언트가 자신이 소유하거나 관리하는 보호된 리소스에 접근해야 할 때 사용된다. 주로 백그라운드에서 실행되는 서버 간 통신, 마이크로서비스 간 API 호출, 또는 사용자와 관계없는 데이터 처리 작업에 적합하다.

이 흐름에서는 권한 부여 서버에 클라이언트 ID와 클라이언트 비밀(또는 다른 인증 수단)을 제출하여 인증을 완료한다. 성공적으로 인증되면 권한 부여 서버는 클라이언트에게 직접 액세스 토큰을 발급한다. 이 과정에서 리프레시 토큰은 일반적으로 발급되지 않는다. 발급된 액세스 토큰은 클라이언트가 리소스 서버의 특정 API를 호출할 때 사용된다.

특징

설명

주요 사용 사례

서버 간 통신, 배치 작업, 조직 내부 시스템 통합

참여 주체

클라이언트, 권한 부여 서버, 리소스 서버

리소스 소유자

불필요 (사용자 인증 없음)

보안 수준

클라이언트 자격 증명의 비밀성 유지가 매우 중요함

이 유형은 사용자 컨텍스트가 필요 없는 기계 대 기계(M2M) 인증에 최적화되어 있다. 따라서 권한 부여 코드 승인이나 암시적 승인과 같은 사용자 동의를 기반으로 하는 흐름과는 근본적으로 목적이 다르다. 구현 시 클라이언트 비밀과 같은 자격 증명을 안전하게 저장하고 관리하는 것이 가장 핵심적인 보안 요구사항이다.

4.5. Device Code Grant

Device Code Grant는 사용자가 입력 장치가 제한된 기기(예: 스마트 TV, 게임 콘솔, IoT 장치)에서 OAuth 2.0 인증을 완료할 수 있도록 설계된 권한 부여 유형이다. 이 방식은 기기가 사용자의 스마트폰이나 컴퓨터와 같은 보조 장치를 통해 인증을 완료하도록 한다. 주로 텍스트 입력이 어렵거나 웹 브라우저가 없는 환경에서 사용된다.

인증 흐름은 다음과 같이 진행된다. 먼저, 클라이언트 기기가 권한 부여 서버(Authorization Server)에 장치 코드 요청을 보낸다. 서버는 device_code, user_code, 그리고 일반적으로 verification_uri와 verification_uri_complete를 응답한다. 사용자는 다른 기기(예: 스마트폰)로 verification_uri에 접속하여 user_code를 입력하고, 평소처럼 자신의 계정으로 로그인 및 권한 승인을 수행한다. 이 동안 클라이언트 기기는 device_code와 client_id를 사용해 서버에 폴링(polling) 요청을 지속적으로 보내어, 사용자의 승인이 완료되고 액세스 토큰(Access Token)이 발급될 때까지 기다린다.

이 방식의 주요 특징과 장단점은 아래 표와 같다.

특징

설명

주요 사용 사례

스마트 TV, 셋톱박스, 프린터, 스피커 등 입력 인터페이스가 제한된 장치.

보안 강점

사용자 자격 증명이 제한된 장치에 직접 입력되지 않는다. 짧은 유효 시간을 가진 user_code를 사용한다.

사용자 경험

사용자는 편리한 기기(스마트폰)에서 인증을 완료할 수 있지만, 두 기기 사이를 오가야 하는 번거로움이 있을 수 있다.

구현 고려사항

클라이언트는 폴링 간격과 만료 시간을 관리해야 한다. 서버는 장치 코드와 사용자 코드를 안전하게 관리하고 매핑해야 한다.

Device Code Grant는 OAuth 2.0의 확장 표준으로 정의되어 있으며, RFC 8628에 공식적으로 명세되어 있다. 이 방식을 사용하면 보안을 유지하면서도 다양한 종류의 장치에서 OAuth 2.0 생태계에 참여할 수 있게 된다.

5. 보안 고려사항

OAuth 2.0은 강력한 인가 프레임워크이지만, 잘못 구현되거나 구성되면 여러 보안 위협에 노출될 수 있다. 주요 공격 유형으로는 교차 사이트 요청 위조(CSRF) 공격이 있다. 이는 공격자가 사용자를 속여 악의적인 권한 부여 요청을 승인하도록 유도하여, 공격자의 클라이언트에 사용자의 권한을 부여하는 방식이다. 이를 방지하기 위해 state 매개변수를 사용하여 요청과 응답을 연결하는 것이 필수적이다. 또한 액세스 토큰이나 리프레시 토큰이 네트워크를 통해 전송되거나 클라이언트 측에 안전하게 저장되지 않을 경우 탈취될 위험이 있다. 탈취된 토큰은 공격자가 합법적인 사용자인 것처럼 리소스 서버에 접근하는 데 악용될 수 있다.

공격 유형

설명

주요 완화 방안

교차 사이트 요청 위조 (CSRF)

사용자를 속여 악의적 클라이언트에 권한을 부여하게 함.

권한 부여 요청 시 임의의 state 매개변수 사용 및 검증.

토큰 탈취/스푸핑

네트워크 스니핑 또는 클라이언트 취약점을 통한 토큰 탈취.

HTTPS(TLS)의 전면적 사용. 토큰을 안전한 저장소(백엔드 서버)에 보관.

권한 부여 코드 가로채기

인가 코드 그랜트 흐름에서 공격자가 인가 코드를 탈취.

클라이언트 인증 사용 및 redirect_uri의 정확한 검증.

리프레시 토큰 공격

리프레시 토큰이 유출되어 새로운 액세스 토큰을 발급받음.

리프레시 토큰 회전 정책 사용. 엄격한 클라이언트 인증.

보안 모범 사례로는 모든 통신에 HTTPS를 사용하는 것이 가장 기본적이며 필수적이다. 이는 토큰과 인증 코드가 평문으로 노출되는 것을 방지한다. 클라이언트는 발급받은 토큰의 범위(scope)를 최소한으로 요청하고, 필요한 권한만을 부여받아야 한다. 또한 리프레시 토큰은 가능한 한 짧은 수명을 가지도록 하고, 사용 시 새로 발급되는 토큰으로 교체하는 토큰 회전 정책을 적용하는 것이 좋다. 인가 서버는 클라이언트를 정확하게 식별하고 인증해야 하며, 등록된 정확한 리디렉션 URI로만 응답을 전송해야 한다. 정기적인 보안 감사와 취약점 점검을 통해 구현의 안전성을 유지하는 것이 중요하다.

5.1. 일반적인 공격 유형 (CSRF, 토큰 탈취 등)

OAuth 2.0 프로토콜은 널리 사용되지만, 잘못된 구현이나 구성은 여러 보안 위협에 노출될 수 있다. 주요 공격 유형으로는 교차 사이트 요청 위조(CSRF), 토큰 탈취 및 재전송 공격, 권한 부여 코드 가로채기, 클라이언트 애플리케이션 자체의 취약점을 이용한 공격 등이 있다.

교차 사이트 요청 위조(CSRF)는 특히 권한 부여 코드 승인(Authorization Code Grant) 흐름에서 중요한 위협이다. 공격자는 피해자가 이미 인증 서버(Authorization Server)에 로그인한 상태를 악용하여, 피해자의 브라우저를 통해 공격자의 클라이언트 애플리케이션에 권한을 부여하도록 유도할 수 있다. 이를 방지하기 위해 OAuth 2.0은 state 매개변수의 사용을 강력히 권장한다. 클라이언트는 인증 요청 시 임의의 state 값을 생성하여 전송하고, 인증 서버는 이 값을 그대로 리디렉션(redirect) URI에 포함하여 반환한다. 클라이언트는 반환받은 state 값이 원래 보낸 값과 일치하는지 반드시 검증해야 한다[5].

토큰 관련 공격도 흔하다. 액세스 토큰(Access Token)이 네트워크를 통해 평문으로 전송되거나 브라우저 저장소에 안전하지 않게 저장될 경우 탈취될 수 있다. 탈취된 토큰은 공격자가 정상 사용자인 것처럼 리소스 서버(Resource Server)에 접근하는 데 악용된다. 또한, 리프레시 토큰(Refresh Token)이 유출되면 공격자가 새로운 액세스 토큰을 무제한으로 발급받을 수 있어 더 심각한 위험을 초래한다. 토큰 탈취를 완화하기 위해 전송 계층 보안(TLS)의 사용은 필수적이며, 토큰의 수명을 짧게 설정하고 리프레시 토큰은 안전하게 저장해야 한다. 아래 표는 주요 공격 유형과 방어 메커니즘을 요약한 것이다.

공격 유형

설명

주요 방어 메커니즘

권한 부여 코드 가로채기

공격자가 정상적인 권한 부여 코드를 탈취하여 자신의 클라이언트에서 사용하는 공격.

redirect_uri의 정확한 검증, PKCE(Proof Key for Code Exchange) 확장 사용

CSRF 공격

사용자의 인증 상태를 악용해 의도하지 않은 권한 부여를 실행.

state 매개변수의 사용과 검증

토큰 탈취/재전송

액세스 토큰 또는 리프레시 토큰을 탈취해 악의적인 클라이언트에서 재사용.

TLS 사용, 토큰 수명 단축, 리프레시 토큰의 안전한 저장

이 외에도 클라이언트가 등록된 redirect_uri를 충분히 검증하지 않으면, 공격자가 권한 부여 코드나 토큰을 다른 도메인으로 전송하는 공격에 취약해진다. 또한, 공개 클라이언트(예: 단일 페이지 애플리케이션)의 경우, 암시적 승인(Implicit Grant) 흐름보다는 권한 부여 코드 승인 흐름과 PKCE 확장을 함께 사용하는 것이 현대적인 보안 모범 사례이다.

5.2. 보안 모범 사례

OAuth 2.0 구현 시 보안을 강화하기 위해 따라야 할 모범 사례는 다음과 같다.

클라이언트 측면에서는 리다이렉트 URI를 엄격하게 검증하고 사전에 등록된 URI만 허용해야 한다. 공격자가 제어하는 URI로 인증 코드가 전달되는 것을 방지하기 위함이다. 또한, 권한 부여 코드 교환 시 PKCE(Proof Key for Code Exchange)를 반드시 사용하여 인증 코드 가로채기 공격을 완화해야 한다. 클라이언트 자격 증명(클라이언트 ID와 비밀키)은 안전하게 저장하고, 공개 클라이언트(예: 모바일 앱, SPA)의 경우에는 클라이언트 비밀키를 사용하지 않는 흐름을 선택한다. 액세스 토큰은 가능한 짧은 수명을 부여하고, 리프레시 토큰은 서버 측에 안전하게 저장하거나, 발급 시 폐기 가능성을 고려해야 한다.

서버(인증 서버 및 리소스 서버) 측면에서는 모든 통신에 TLS(HTTPS)를 사용하는 것이 필수적이다. 토큰은 반드시 Bearer Token 사용법에 따라 전송하며, 토큰 자체에 민감한 정보를 포함하지 않는다. 인증 서버는 다양한 권한 부여 유형(Grant Types)에 대해 적절한 범위(Scope) 검증을 수행하고, 클라이언트 유형에 맞는 흐름만 허용해야 한다. 리소스 서버는 액세스 토큰의 서명, 만료 시간, 발행자(Issuer), 대상자(Audience) 등을 철저히 검증해야 한다. 또한, 정기적인 보안 감사와 취약점 점검을 통해 토큰 탈취, 재생 공격 등의 위협에 대비한다.

보안 영역

주요 모범 사례

통신

모든 엔드포인트에 TLS 1.2/1.3 적용, 민감 데이터 평문 전송 금지

토큰 관리

액세스 토큰 짧은 수명 설정, 리프레시 토큰 안전한 저장 및 회전, JWT 서명 필수 검증

클라이언트

리다이렉트 URI 검증, PKCE 사용, 클라이언트 자격 증명 안전한 보관

인증 서버

클라이언트 유형별 적절한 Grant Types 허용, 강력한 범위(Scope) 승인 제어 구현

모니터링

비정상적인 토큰 사용 패턴 감지 및 로깅, 정기적인 취약점 평가 수행

표준과 라이브러리를 최신 상태로 유지하는 것도 중요하다. OAuth 2.0 보안 고려사항(RFC 6819) 및 최신 권고 사항을 따르고, 검증된 공식 라이브러리를 사용하여 직접 구현 시 발생할 수 있는 보안 결함을 피해야 한다.

6. OAuth 2.0 vs OAuth 1.0

OAuth 2.0은 OAuth 1.0의 후속 버전으로 설계되었으나, 단순한 업그레이드라기보다는 접근 방식을 근본적으로 재정의한 새로운 프로토콜이다. 두 버전은 보안 모델, 복잡성, 사용 편의성 등 여러 측면에서 뚜렷한 차이를 보인다.

가장 큰 차이는 보안 메커니즘에 있다. OAuth 1.0은 메시지 서명을 핵심 보안 수단으로 사용한다. 클라이언트는 모든 요청에 대해 공유 비밀키와 토큰 비밀을 사용해 복잡한 서명을 생성해야 하며, 이 서명을 통해 메시지의 무결성과 출처를 검증한다. 반면, OAuth 2.0은 HTTPS(TLS) 통신에 의존하며, 서명 대신 액세스 토큰을 사용한다. 이로 인해 구현이 간소화되었지만, 반드시 암호화된 채널을 사용해야 한다는 전제 조건이 생겼다. 또한, OAuth 1.0은 단일한 액세스 토큰만을 정의했지만, OAuth 2.0은 액세스 토큰과 리프레시 토큰을 분리하여 보안과 사용자 경험을 개선했다.

아키텍처와 사용 편의성 측면에서도 대비된다. OAuth 1.0은 상대적으로 엄격하고 모놀리식한 프레임워크였으나, OAuth 2.0은 모듈화되고 유연한 아키텍처를 채택했다. 다양한 장치와 애플리케이션 유형(웹, 모바일, 데스크톱, 스마트 디바이스)에 맞춘 여러 종류의 권한 부여 유형을 정의하여 상황에 맞는 최적의 흐름을 선택할 수 있게 했다. 이에 따라 OAuth 2.0의 명세는 핵심 프레임워크와 확장 명세로 분리되어 발전하고 있다. 결과적으로 OAuth 2.0은 개발자 친화적이고 구현이 더 쉬우며, 현대적인 애플리케이션 환경에 더 잘 부합한다고 평가받는다.

비교 항목

OAuth 1.0

OAuth 2.0

핵심 보안

메시지 서명 (Signature)

HTTPS(TLS) + 액세스 토큰

토큰

단일 액세스 토큰 (Access Token)

액세스 토큰 + 리프레시 토큰 (선택적)

복잡도

구현이 복잡함

구현이 상대적으로 단순함

아키텍처

단일한 프로토콜

모듈화된 프레임워크

흐름 유형

제한적

다양한 권한 부여 유형 (Grant Type) 지원

주요 적용처

주로 웹 애플리케이션

웹, 모바일, 데스크톱, IoT 등 광범위

결론적으로, OAuth 2.0은 OAuth 1.0의 복잡한 서명 방식을 제거하고 현대의 보안 인프라(HTTPS)를 활용함으로써 광범위한 채택을 이끌어냈다. 그러나 이러한 간소화는 프로토콜 자체의 보안성을 낮춘다는 비판도 존재한다. OAuth 2.0의 안전한 구현을 위해서는 반드시 HTTPS를 사용하고, 명세에서 제시하는 보안 모범 사례를 철저히 따라야 한다. 현재 대부분의 새로운 구현은 OAuth 2.0을 기준으로 하며, OAuth 1.0은 레거시 시스템에서 주로 발견된다.

7. 확장 및 관련 표준

OAuth 2.0은 권한 위임을 위한 프레임워크를 제공하지만, 사용자 인증에 대한 표준화된 방법을 정의하지는 않는다. 이 간극을 메우기 위해 OpenID Connect(OIDC)가 OAuth 2.0 위에 구축된 인증 레이어로 개발되었다. OIDC는 ID 토큰이라는 새로운 토큰 유형을 도입하며, 이 토큰은 사용자의 신원 정보(클레임)를 안전하게 전달한다. ID 토큰은 일반적으로 JSON Web Token(JWT) 형식으로 인코딩되어, 클라이언트가 토큰의 내용과 발행자를 검증할 수 있게 한다.

JWT는 OAuth 2.0 및 OIDC 생태계에서 중요한 역할을 하는 개방형 표준이다. 이는 당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의한다. JWT는 헤더, 페이로드, 서명의 세 부분으로 구성되며, 서명을 통해 토큰의 무결성과 발신자를 검증할 수 있다. OAuth 2.0의 액세스 토큰이 API 접근 권한을 부여하는 데 사용된다면, JWT는 그 자체로 신뢰할 수 있는 정보의 전달 수단으로 활용된다.

OAuth 2.0의 확장성은 다양한 특수 상황을 위한 추가 권한 부여 유형(Grant Type)을 표준화하는 데서도 나타난다. 예를 들어, Device Code Grant는 스마트 TV나 IoT 디바이스처럼 입력 장치가 제한된 환경에서 사용자를 인증하기 위해 설계되었다. 또한, 토큰 교환(Token Exchange), 백채널 로그아웃(Back-Channel Logout), 그리고 보다 세분화된 동의 관리와 같은 확장 표준들이 지속적으로 제안되고 채택되고 있다.

표준/확장

주요 목적

OAuth 2.0과의 관계

OpenID Connect (OIDC)

사용자 신원 인증

OAuth 2.0을 기반으로 구축된 상위 계층

JSON Web Token (JWT)

정보를 안전하게 표현(표현 형식)

액세스 토큰 또는 ID 토큰의 포맷으로 흔히 사용됨

Device Code Grant

입력 제한 장치용 인증 흐름

OAuth 2.0의 표준 권한 부여 유형 중 하나

JWT Bearer Token Grant

이미 보유한 JWT를 사용하여 액세스 토큰 교환

OAuth 2.0의 확장 권한 부여 유형

7.1. OpenID Connect (OIDC)

OpenID Connect(OIDC)는 OAuth 2.0 프레임워크 위에 구축된 인증 계층이다. OAuth 2.0이 주로 API 접근을 위한 권한 부여에 중점을 두는 반면, OIDC는 최종 사용자가 누구인지 확인하는 표준화된 방법을 제공한다. 이를 통해 클라이언트 애플리케이션은 사용자의 신원 정보를 안전하게 확인하고 그 기본 프로필 정보를 얻을 수 있다.

OIDC의 핵심은 ID 토큰이다. ID 토큰은 JSON Web Token(JWT) 형식으로 인코딩되며, 인증 서버가 서명하여 발행한다. 이 토큰에는 사용자의 신원을 주장하는 클레임(예: 사용자 식별자, 발행자, 만료 시간)이 포함되어 있다. 클라이언트는 이 토큰의 서명을 검증하여 인증 응답의 진위와 무결성을 확인한다. OAuth 2.0의 액세스 토큰이 '무엇을 할 수 있는가'(권한)를 나타낸다면, ID 토큰은 '누구인가'(신원)를 나타낸다.

OIDC는 몇 가지 표준 엔드포인트와 사용자 정보를 정의한다. 주요 엔드포인트로는 발견 문서를 제공하는 /.well-known/openid-configuration, 인증 요청을 처리하는 /authorize, 토큰을 교환하는 /token, 그리고 사용자 프로필 정보를 반환하는 /userinfo가 있다. 표준 프로필 클레임에는 sub(주체 식별자), name, email, picture 등이 포함된다.

구성 요소

설명

ID 토큰

사용자 인증을 증명하는 JWT 형식의 토큰.

UserInfo 엔드포인트

액세스 토큰으로 호출하여 추가 사용자 클레임을 가져오는 API.

발견 문서

OIDC 공급자의 구성(엔드포인트 URL, 지원 알고리즘 등)을 기술한 JSON 문서.

인증 요청

scope 매개변수에 openid를 포함하여 OIDC 흐름을 시작한다.

이 표준은 싱글 사인온(SSO)과 연합 신원 관리의 기반이 되며, OAuth 2.0만으로는 부족했던 상호 운용 가능한 신원 정보 교환 문제를 해결한다. 결과적으로 현대 애플리케이션은 OAuth 2.0으로 리소스 서버에 대한 접근을 권한 부여하고, OIDC로 최종 사용자를 안전하게 인증하는 조합을 널리 사용한다.

7.2. JWT (JSON Web Token)

JWT는 JSON 객체를 사용하여 당사자 간에 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이 정보는 디지털 서명되어 있으므로 신뢰할 수 있고 검증이 가능하다. JWT는 HMAC 알고리즘을 사용하는 비밀키나 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍으로 서명할 수 있다. 서명된 JWT는 토큰 내의 클레임 무결성을 검증하지만, 암호화된 JWT는 당사자 간에 추가적인 기밀성을 제공한다.

JWT는 점('.')으로 구분된 세 부분으로 구성된다.

* 헤더(Header): 일반적으로 토큰 유형(JWT)과 사용된 서명 알고리즘(예: HMAC SHA256 또는 RSA)의 두 부분으로 구성된다.

* 페이로드(Payload): 엔티티(일반적으로 사용자)에 대한 추가 데이터와 기타 클레임을 포함하는 클레임을 담는다. 클레임에는 등록된 클레임, 공개 클레임, 비공개 클레임의 세 종류가 있다.

* 서명(Signature): 인코딩된 헤더, 인코딩된 페이로드, 비밀키를 사용하여 생성된다. 서명은 메시지가 전송 중에 변경되지 않았음을 확인하는 데 사용된다.

JWT의 일반적인 구조는 다음과 같다.

xxxxx.yyyyy.zzzzz

구성 요소

설명

예시 내용 (디코딩 후)

헤더

토큰 유형과 알고리즘 정의

{"alg": "HS256", "typ": "JWT"}

페이로드

토큰에 담긴 데이터(클레임)

{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}

서명

헤더와 페이로드의 무결성 검증을 위한 서명

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

OAuth 2.0 및 OpenID Connect에서 JWT는 액세스 토큰 또는 ID 토큰의 형식으로 널리 사용된다. 특히 OIDC의 ID 토큰은 반드시 JWT 형식이어야 한다. JWT는 자체적으로 필요한 모든 정보를 포함하는 독립적인 토큰이므로, 리소스 서버는 토큰의 서명만 검증하면 사용자 정보나 권한을 확인할 수 있다. 이는 매번 인증 서버에 토큰을 검증 요청할 필요가 없는 Stateless 아키텍처를 구현하는 데 유리하다. 그러나 토큰이 취소되기 전까지 만료 시간까지 유효하다는 점에서, 즉시적인 토큰 폐기가 어렵다는 단점도 존재한다.

8. 구현 및 활용

구현을 시작하기 전에, 클라이언트는 OAuth 서비스를 제공하는 인증 서버에 등록되어야 한다. 이 과정을 클라이언트 등록이라고 한다. 등록 시 일반적으로 클라이언트 이름, 웹사이트, 리디렉션 URI (콜백 URL) 등을 제공하며, 인증 서버는 고유한 클라이언트 ID와 클라이언트 시크릿을 발급한다. 클라이언트 시크릿은 웹 서버 애플리케이션과 같이 안전하게 보관할 수 있는 백엔드 서버에서 사용하는 비밀 키이다. 공개적으로 노출되는 네이티브 앱이나 싱글 페이지 애플리케이션의 경우 클라이언트 시크릿을 안전하게 보관하기 어려우므로, PKCE(Proof Key for Code Exchange)와 같은 추가 보안 메커니즘을 사용한다.

가장 일반적인 권한 부여 코드 승인 유형의 흐름을 구현하는 예시는 다음과 같다.

1. 사용자가 클라이언트 애플리케이션에서 "구글로 로그인" 버튼을 클릭한다.

2. 클라이언트는 사용자를 인증 서버의 인증 엔드포인트로 리디렉션하며, client_id, redirect_uri, response_type=code, scope(요청 권한 범위) 등의 매개변수를 전달한다.

3. 사용자는 인증 서버에서 자신의 계정으로 로그인하고, 클라이언트가 요청한 권한에 동의한다.

4. 인증 서버는 사용자를 사전에 등록된 redirect_uri로 리디렉션시키며, 쿼리 문자열에 권한 부여 코드를 포함시킨다.

5. 클라이언트의 백엔드 서버는 이 권한 부여 코드를 사용하여 인증 서버의 토큰 엔드포인트에 요청을 보내고, client_id, client_secret, grant_type=authorization_code와 함께 코드를 제출한다.

6. 인증 서버는 코드의 유효성을 검증한 후, 액세스 토큰과 (선택적으로) 리프레시 토큰을 JSON 형식으로 응답한다.

7. 클라이언트는 이 액세스 토큰을 사용하여 리소스 서버(예: 사용자의 구글 프로필 정보 API)에 보호된 자원을 요청할 수 있다.

다른 권한 부여 유형의 구현은 이 기본 흐름에서 변형된다. 예를 들어, 클라이언트 자격 증명 승인은 사용자 대신 클라이언트 자신의 신원을 인증하는 데 사용되며, 백그라운드 프로세스에서 API를 호출할 때 흔히 쓰인다. 이 경우 클라이언트는 client_id와 client_secret을 직접 토큰 엔드포인트에 제출하여 액세스 토큰을 받는다.

8.1. 클라이언트 등록

클라이언트 등록은 OAuth 2.0 흐름을 시작하기 전에, 클라이언트 애플리케이션이 인증 서버에 자신의 정보를 등록하는 필수 절차이다. 이 과정을 통해 클라이언트는 고유한 식별자(클라이언트 ID)와 비밀(클라이언트 시크릿)을 발급받는다. 등록은 일반적으로 개발자가 인증 서버 제공자의 개발자 포털이나 관리 콘솔을 통해 수동으로 이루어진다.

등록 시 제공해야 하는 주요 정보는 다음과 같다.

등록 정보

설명

클라이언트 이름

사용자에게 표시될 애플리케이션의 이름이다.

클라이언트 유형

퍼블릭 클라이언트(예: 모바일 앱, SPA) 또는 컨피덴셜 클라이언트(예: 웹 서버 앱)로 구분된다.

리디렉션 URI

인증 코드나 액세스 토큰을 전달받을 최종 URI이다. 보안 상 중요한 요소로, 미리 등록된 URI와 정확히 일치해야 한다.

권한 범위

애플리케이션이 요청할 수 있는 스코프 목록(예: read:profile, write:file)이다.

권한 부여 유형

지원할 권한 부여 유형(예: authorization_code, client_credentials)을 지정한다.

등록이 완료되면 인증 서버는 client_id와 client_secret(컨피덴셜 클라이언트의 경우)을 발급한다. client_id는 공개되어도 무방하지만, client_secret은 서버 측에서 안전하게 보관해야 하는 비밀 키 역할을 한다. 퍼블릭 클라이언트(예: 단일 페이지 애플리케이션)의 경우 client_secret을 안전하게 저장할 수 없으므로, 이 값을 사용하지 않는 권한 부여 유형을 선택하거나 추가적인 보안 장치를 적용한다.

클라이언트 등록 정보는 이후 모든 OAuth 트랜잭션의 기초가 되며, 인증 서버가 클라이언트의 신원을 확인하고, 올바른 리디렉션 URI로만 응답을 보내며, 요청된 스코프의 적절성을 판단하는 데 사용된다. 등록 정보는 필요에 따라 갱신되거나 폐지될 수 있다.

8.2. 인증 흐름 구현 예시

권한 부여 코드 부여(Authorization Code Grant) 방식의 구현 예시는 일반적으로 다음과 같은 단계로 진행된다. 먼저, 클라이언트 애플리케이션은 사용자를 인증 서버(Authorization Server)의 인증 엔드포인트로 리디렉션한다. 이 요청에는 client_id, redirect_uri, response_type=code, 그리고 요청하는 권한 범위(scope)와 상태 값을 위한 state 매개변수가 포함된다.

사용자가 인증 서버에서 자신의 신원을 확인하고 요청된 권한에 동의하면, 인증 서버는 미리 등록된 redirect_uri로 사용자를 다시 클라이언트로 리디렉션한다. 이때 리디렉션 URL의 쿼리 문자열에 code(권한 부여 코드)와 state 매개변수가 첨부된다. 클라이언트는 반환된 state 값을 검증하여 요청의 위변조를 방지한다.

단계

행위자

행동

주요 매개변수

1. 인증 요청

클라이언트

사용자를 인증 서버로 리디렉션

client_id, redirect_uri, response_type=code, scope, state

2. 사용자 동의

사용자

인증 서버에서 로그인 및 권한 동의

-

3. 코드 발급

인증 서버

사용자를 클라이언트의 redirect_uri로 리디렉션하며 코드 전달

code, state

4. 토큰 교환

클라이언트

code를 사용하여 인증 서버의 토큰 엔드포인트에 요청

grant_type=authorization_code, code, redirect_uri, client_id, client_secret

5. 토큰 발급

인증 서버

액세스 토큰과 리프레시 토큰을 응답

access_token, refresh_token, expires_in

검증이 완료되면, 클라이언트는 획득한 code를 액세스 토큰으로 교환한다. 클라이언트는 인증 서버의 토큰 엔드포인트에 백엔드 간 요청을 보내며, 이 요청에는 grant_type=authorization_code, code, redirect_uri, 그리고 클라이언트 인증 정보(client_id와 client_secret)가 포함된다. 인증 서버는 코드의 유효성을 확인한 후, 응답 본문(보통 JSON 형식)으로 액세스 토큰, 리프레시 토큰, 토큰 유형 및 만료 시간을 발급한다. 클라이언트는 이 액세스 토큰을 사용하여 리소스 서버에 보호된 자원을 요청할 수 있다.

9. 관련 문서 및 참고 자료

  • Wikipedia - OAuth

  • IETF - The OAuth 2.0 Authorization Framework

  • OAuth.net - Official Website

  • Google Identity - Using OAuth 2.0 to Access Google APIs

  • Microsoft Identity Platform - OAuth 2.0 and OpenID Connect protocols

  • Naver Developers - 네이버 아이디로 로그인 API 가이드 (OAuth 2.0)

  • Kakao Developers - 카카오 로그인 REST API

리비전 정보

버전r1
수정일2026.02.14 23:11
편집자unisquads
편집 요약AI 자동 생성