본문 바로가기
보안

OAuth 1.0 Protocol

by kdohyeon (김대니) 2023. 4. 10.
반응형

OAuth

"카카오톡으로 로그인하기", "페이스북으로 로그인하기" 등의 기능은 사용자에게 편리함을 가져다 줍니다. 회원가입을 하기 위해 개인 정보를 다 입력할 필요도 없고 몇 번의 클릭만으로 로그인을 할 수 있기 때문입니다. 이러한 기능을 가능케 하는 인증 절차가 바로 OAuth 입니다. 기본 개념에 대해 알아보기 위해 RFC (Request for Comment) 5849 문서에 기반하여 OAuth 1.0 프로토콜에 대해 알아보려고 합니다. (요즘 흔히 이야기하는 OAuth 는 2.0 버전으로 이 문서의 내용과는 조금 다를 수 있습니다.)


Open Authorization, OAuth

웹 서비스에서 사용자 인증을 하는 방법은 다양하다. 가장 간단한 방법으로는 직접 ID 와 PASSWORD 를 입력하여 본인 인증을 할 수 있다. 최근의 웹 서비스는 대부분 타 서비스에 가입된 정보를 기반으로 본인 인증을 하는 기능을 제공한다. 아래 그림은 "내집다오" 라는 서비스에 로그인을 할 때 노출되는 화면인데, 카카오톡, 페이스북, 애플 등에 가입된 개인 정보를 바탕으로 해당 웹 서비스에 로그인을 할 수 있다.

카톡 정보로 로그인이 가능

이런 기능은 과연 어떻게 동작하는걸까? ID 와 PASSWORD 를 직접 입력하지 않고 몇 번의 클릭만으로 로그인을 간편하게 할 수 있다는 것은 정말 놀랍다. 이걸 가능하게 해주는 것이 바로 OAuth 프로토콜이라는 것인데, 2010년 IETF에서 발표된 개념으로 인터넷 어플리케이션에서 사용자 인증에 사용되는 표준 인증 방법이다. 위키백과에 따르면 OAuth 에 대한 정의는 다음과 같다.

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.

배경. OAuth, 왜 필요한가?

"내집다오" 라는 서비스에 사용자의 "카카오톡" 계정 정보로 로그인을 하는 기능을 개발한다고 하면, 가장 간단한 방법으로는 사용자가 직접 "카카오톡" 계정 정보를 "내집다오" 서비스에게 제공하는 것이다. "내집다오" 는 사용자 정보를 저장하고 있다가 인증 과정에서 가져다 사용할 수 있다. 하지만 이러한 과정은 모두에게 위험하며, "카카오톡" 계정 정보를 "내집다오"에게 제공하지 않아도 로그인을 할 수 있다.

위험한 인증 과정

  • 사용자 (나): 카카오톡에 가입한 계정 정보를 왜 "내집다오"에게 알려줘야 하지?
  • 내집다오: 카카오톡 계정 정보를 직접 관리하다가 문제가 생기면 어떡하지?
  • 카카오톡: 사용자에 대한 정보에 대해서 사용자도 아니고 왜 내집다오가 접근하려고 하지?

OAuth 프로토콜은 이러한 문제점들을 해결하기 위해 나온 개념이다. OAuth 를 활용하면 "내집다오"는 "카카오톡"으로부터 사용자의 특정 자원 (i.e., 사용자의 계정 정보) 에 대한 접근 및 사용할 수 있는 권한을 받게 된다.

OAuth 관련 용어

OAuth 를 이해하기 위해서는 먼저 OAuth 와 관련된 용어에 대한 이해가 필요하다.

Client (Consumer)

"내집다오" 에 해당하는 역할로 Resource Server 의 기능을 사용하려는 웹 서비스

Resource Server (Service Provider)

"카카오톡" 에 해당하는 역할로 OAuth 를 사용하는 OpenAPI 를 제공하는 서비스

Resource Owner (User)

"사용자 (나)" 에 해당하는 역할로 Resource Server 에 계정을 가지고 있고, Client 를 이용하려는 사용자

Protected Resource

"로그인 계정 정보" 에 해당하는 부분으로 Resource Owner 에 대한 자원이며 Resource Server 에서 관리된다.

Request Token

Client 가 Resource Server 에게 접근 권한을 인증받기 위해 사용하는 값으로 인증이 완료된 후에는 Access Token 으로 교환한다. (임시 Token 같은 개념)

Access Token

인증 후 Client 가 Resource Server 의 Protected Resource 에 접근하기 위한 Token

OAuth 개념 소개

Client, Resource Server, Resource Owner 가 어떻게 상호작용하는지 알아보며 OAuth 의 개념에 대해 이해해보자.

1. Client 등록 (사전 승인)

Client 가 Resource Server 를 이용하기 위해서는 (즉, Client 에서 OAuth 를 통한 로그인 서비스를 제공하기 위해서는) Resource Server 에 자신의 서비스를 등록함으로써 사전 승인을 받아야 한다. Resource Server로부터 사전 승인을 받으면 Client 에 대한 Identifier 와 Shared-secret 정보를 얻을 수 있다.

OAuth 프로토콜을 사용하기 이전에 Client 는 Resource Server 에게 사전 승인을 받아두어야 한다.

2. Request Token 발급받기

발급받은 Identifier 와 Shared-secret 을 기반으로 Request Token 을 발급받아야 한다. Request Token 을 발급받기 위해서 Client 는 Resource Server 에게 Identifier, 암호화된 Shared-secret (i.e., HMAC-SHA1 알고리즘 활용), 인증이 마무리되면 Client 가 리다이렉트할 URL 을 전달한다. Resource Server 는 그에 대한 응답으로 Request Token을 반환한다.

Request Token 발급받기

(Request Token 을 발급받는 과정은 "카카오톡"에게 나 "내집다오"인데, 사용자의 로그인 정보에 접근해도 될까요? 물어보는 것과 같음.)

3. 사용자 인증 페이지 호출

Resource Server 에 저장되어 있는 정보를 기반으로 Client 에 로그인을 할 것인지 Resource Owner 에게 물어본다. 아래 사진과 같이 "내집다오" 는 사용자인 나에게 "카카오톡" 을 활용해서 로그인을 할 것인지 물어보고 있다.

사용 권한을 물어보는 페이지

여기서 확인 버튼을 누르게 되면 카카오톡으로 로그인을 하는 화면으로 넘어가게 된다. 발급받은 Request Token 을 이용해서 Resource Server 가 정해둔 사용자 인증 페이지를 Resource Owner 에게 보여주는 과정이다.

카카오톡 로그인 화면

Resource Server 가 요구하는 사용자 인증에 성공을 하면 (여기서는 로그인) "내집다오"가 "카카오톡"에서 Client 에 대한 어떤 권한을 허용할 지 정하게 된다. 아래와 같이 사용자에게 동의를 구하는 화면이 노출된다. 

사용자에게 동의를 구하는 화면

4. Access Token 요청하기

인증이 마무리되면 Client 는 Resource Server 로부터 Access Token 을 발급받아야 한다. 발급 요청을 할 땐 Request Token 에 기반한다. 이 때, Resource Server 에 따라 사용자 ID, 프로필 정보 등이 반환되기도 한다.

Client 는 사용자의 Access Token 값을 저장하고 있다가, Resource Server 에게 필요한 정보를 얻어올 수 있다. 

5. 전체 과정

전체 과정을 그림으로 표현하면 다음과 같다.

https://oauth.net/core/diagram.png

참고할 것. OAuth 는 로그인에 한정된 것이 아니다

OAuth 프로토콜은 로그인을 하기 위해 만들어진 것이 아니다. 이름부터 Open Authorization (인가) 이기 때문에 로그인 뿐만 아니라 Client 가 Resource Server 에서 사용할 수 있는 권한이 포함되어 있다. 로그인 접근 권한도 그 권한 중에 하나인 것이다. 필요에 따라 Resource Owner 가 허용하면 Resource Server 로부터 데이터파일 등 다른 권한도 부여받을 수 있다.

OAuth 1.0 vs. OAuth 2.0

OAuth 2.0 은 OAuth 1.0 에서 보안적인 부분이 개선되었다.

  • 만료 기한이 없었던 Access Token 은 만료 기한이 생겼다. Client 가 관리하는 Access Token 이 만료되면 다시 사용자에게 권한을 부여받아야 하는데, 매번 만료될 때마다 물어보는 것은 불필요하다. 따라서 Refresh Token 개념이 나오게 되었고, Access Token 이 만료되면 Refresh Token 으로 Resource Server 로부터 새로운 Access Token 을 발급받을 수 있다.

참고 자료

반응형

댓글