사용자가 자신의 비밀번호를 공유하지 않고도 제3자 애플리케이션이 자신의 리소스에 안전하게 접근할 수 있도록 설계된 권한 부여 프레임워크
Client application
사용자 데이터에 액세스하려는 웹사이트 또는 웹 애플리케이션
Ex) Kakao 또는 Google 계정으로 로그인하려는 제3자 애플리케이션
Resource owner
클라이언트 애플리케이션이 액세스하려는 데이터의 소유자
Ex) 사용자의 계정 정보, 파일, API 데이터 등
OAuth service provider
사용자 데이터와 데이터에 대한 액세스를 제어하는 웹사이트 또는 애플리케이션
인증 서버 및 리소스 서버와 상호 작용할 수 있는 API를 제공하여 OAuth를 지원함
GET /authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=code&scope=openid%20profile&state=ae13d489bd00e3c24 HTTP/1.1
client_id
클라이언트 애플리케이션의 고유 식별자를 포함하는 필수 매개변수.
이 값은 클라이언트 애플리케이션이 OAuth 서비스에 등록할 때 생성된다.
redirect_uri
인증 코드를 클라이언트 애플리케이션으로 전송할 때 사용자의 브라우저가 리디렉션되어야 하는 URI. "콜백 URI" 또는 "콜백 엔드포인트"라고도 한다. 많은 OAuth 공격은 이 매개변수의 유효성 검사 결함을 악용하는 데 기반한다.
response_type
클라이언트 애플리케이션이 예상하는 응답 종류와 이에 따라 어떤 플로우를 시작할지 결정. Authorization request 유형의 경우 값은 코드여야 한다.
scope
클라이언트 애플리케이션이 액세스하려는 사용자 데이터의 하위 집합을 지정하는데 사용한다.
state
클라이언트 애플리케이션의 현재 세션에 연결된 추측할 수 없는 고유한 값을 저장한다. OAuth 서비스는 인증 코드와 함께 이 정확한 값을 응답에 반환해야 한다.
이 매개변수는 클라이언트 애플리케이션의 /callback
엔드포인트에 대한 요청이 OAuth 플로우를 시작한 사람과 동일한 사람으로부터 온 것인지 확인하여 클라이언트 애플리케이션에 대한 일종의 CSRF 토큰 역할을 한다.
사용자가 요청된 액세스에 동의하면 브라우저는 authorization request의 redirect_uri 매개변수에 지정된 /callback
엔드포인트로 리디렉션된다.
그 결과 GET Request에는 Authorization code가 쿼리 파라미터로 포함된다. 구성에 따라 authorization request와 동일한 값으로 state 매개변수를 Request 할 수 있다.
GET /callback?code=a1b2c3d4e5f6g7h8&state=ae13d489bd00e3c24 HTTP/1.1
Host: client-app.com
클라이언트 애플리케이션이 인증 코드를 받으면 이를 액세스 토큰으로 교환해야 한다. 이를 위해 서버 간 POST 요청을 OAuth 서비스의 /token
엔드포인트로 요청한다. 이 시점부터의 모든 통신은 보안 백채널에서 이루어지므로 일반적으로 공격자가 관찰하거나 제어할 수 없다.
POST /token HTTP/1.1
Host: oauth-authorization-server.com
…
client_id=12345&client_secret=SECRET&redirect_uri=https://client-app.com/callback&grant_type=authorization_code&code=a1b2c3d4e5f6g7h8
OAuth 서비스는 액세스 토큰 요청의 유효성을 검사한다. 모든 것이 예상과 같으면 서버는 클라이언트 애플리케이션에 요청된 범위의 액세스 토큰을 부여하여 응답한다.
{
"access_token": "z0y9x8w7v6u5",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "openid profile",
…
}
이제 클라이언트 애플리케이션에 액세스 코드가 있으므로 리소스 서버에서 사용자의 데이터를 가져올 수 있다. 데이터를 가져오기 위해 OAuth 서비스의 /userinfo
엔드포인트로 API 호출을 수행한다. 엑세스 토큰을 Authorization: Bearer
헤더에 첨부해 클라이언트 애플리케이션이 이 데이터에 액세스할 수 있는 권한이 있음을 증명한다.
리소스 서버는 토큰이 유효한지, 현재 클라이언트 애플리케이션에 속해 있는지 확인해야 합니다. 토큰이 유효하며, 현재 클라이언트 애플리케이션에 속해있을 경우, 요청된 리소스의 액세스 토큰 범위에 따라서 사용자 데이터를 전송하여 응답한다.
{
"username":"carlos",
"email":"carlos@carlos-montoya.net",
…
}