사용자가 웹사이트나 애플리케이션의 접근 권한을 얻기 위해, 비밀번호를 제공하는 대신 타 웹사이트 상의 자신들의 정보를 사용하도록 하는 것이다.
예를 들면 Kakao, Naver, Google, Facebook 등의 계정으로 어떤 임의의 타 서비스에 로그인하는 것이 있다.
OAuth는 무엇이 좋은가?
사용자 입장에서는
- 서비스마다 각각의 계정을 관리할 필요가 없다. 하나의 로그인으로 여러 서비스를 사용할 수 있다.
- 서비스의 보안을 더 신뢰할 수 있다.
- 개인 정보 노출을 최소화하거나 관리할 수 있다.
서비스 입장에서는
- 회원의 계정정보 관리에 많은 노력을 기울이지 않아도 된다.
- 사용자 획득 가능성이 높아진다.
OAuth API를 제공하는 서비스 입장에서는
- 자기 서비스에 대한 서드파티 애플리케이션 개발을 허용할 수 있다.
- 사용자에 대한 추가 정보를 알 수 있다. (어떤 유형의 서비스를 사용하는지 등)
- 사실상의 서비스 광고(?)도 될 것이다.
OAuth는 어떻게 동작하는가?
OAuth 인증방식은 약간 복잡하다. UOSTime이 카카오 계정으로 로그인을 지원한다고 예를 들어보자.
사용자의 로그인 과정을 아주 간단히 요약하면 다음과 같다.
- 사용자가 카카오 로그인을 수행한다.
- 카카오가 UOSTime에게 사용자 정보를 제공한다.
너무 요약한 나머지 부족한 부분이 많다.
카카오는 사용자 정보를 UOSTime에 줘야 한다는 사실을 어떻게 알까? 위 과정을 조금만 더 자세히 하면 다음과 같다.
- UOSTime이 사용자를 카카오로 이동시킨다.
- 이때, 로그인을 끝내면 카카오로 다시 돌아오라고 redirect URI를 메모해둔다.
- 사용자가 카카오 로그인을 수행한다.
- 카카오는 메모(redirect URI)에 따라 사용자를 UOSTime으로 이동시킨다.
- UOSTime은 카카오에게 사용자 정보를 요청한다.
- 카카오가 UOSTime에게 사용자 정보를 제공한다.
하지만, 로그인을 끝내고 다시 돌아오는 곳이 UOSTime이라는 것을 보장하려면 어떻게 해야 할까?
UOSTime이 사전에 카카오에게 자신의 정보를 등록해놓아야 한다.
- UOSTime은 카카오에게 OAuth API 사용 신청을 한다. 이때 redirect URI도 제출한다.
- 카카오는 UOSTime에게 요청토큰과 비밀키를 발급한다.
- UOSTime은 앞으로 사용자를 카카오로 이동시킬 때 redirecr URI 뿐만 아니라 요청토큰도 함께 보낸다.
- 사용자가 로그인 하면, 카카오는 사용자를 다시 UOSTime으로 되돌려 보낼 때 인증코드를 함께 보낸다.
- UOSTime은 요청토큰, 비밀키, 인증코드, redirect URI를 카카오에 제출함으로써 자신의 신원을 보증한다.
- 카카오는 UOSTime의 요청에 따라 UOSTime에게 사용자 정보를 제공한다.
여기서, '사용자 정보를 제공한다'는 부분은 사실 더 세부적으로 들어가야 한다. 카카오가 UOSTime에게 사용자의 모든 정보를 제공하는 것은 아니다. 그리고 정보 제공뿐만 아니라 카카오에게 무언가 액션을 요청할 수도 있다.
- 사용자는 카카오 로그인 과정에서, 카카오가 UOSTime에게 어떤 권한을 제공할지 선택/확인할 수 있다.
- UOSTime은 사용자가 사전에 허용한 범위 내에서 카카오에게 정보/액션 등을 요청한다.
정리
위 내용을 정리하고 더 자세히 적은 내용은 다음과 같다(구체적인 방법은 다를 수 있지만, 큰 맥락에서는 같다).
- UOSTime은 카카오 로그인 기능을 제공하기 위해, 아래와 같이 사전 작업을 해두어야 한다.
- UOSTime은 카카오에게 OAuth API 사용 신청을 한다. 이때 redirect URI도 제출한다.
- 카카오는 UOSTime에게 요청토큰과 비밀키를 발급한다.
- 이제 UOSTime과 카카오 모두 요청토큰, 비밀키, redirect URI가 무엇인지 알고 있다. 특히 비밀키는 오직 UOSTime과 카카오만 알고 있다. 따라서 비밀키를 안다는 것은 본인의 신원을 보증하는 것과 같다.
- 사용자가 UOSTime에 카카오 계정으로 로그인하려고 한다.
- UOSTime은 사용자를 카카오로 이동시킨다. 이때 요청토큰과 redirect URI도 함께 보낸다.
- 사용자가 카카오 로그인을 수행한다.
- 로그인을 완료했으면, 카카오는 요청토큰과 redirect URI가 유효한지 검사한다.
- 유효하지 않다면 오류인 것이다.
- 카카오는 사용자에게, 카카오가 UOSTime에게 어떤 권한을 제공할지 설정/확인하게 한다.
- 카카오는 redirect URI(UOSTime)로 사용자를 돌려보낸다. 이때 인증코드를 함께 보낸다.
- UOSTime은 인증코드를 확인한다.
- UOSTime은 카카오에게 요청토큰, 비밀키, redirect URI, 인증코드를 보낸다.
- 카카오는 이들의 유효성을 확인하고 액세스 토큰을 발급한다.
- 액세스 토큰을 가진 UOSTime은 허용된 권한 내에서 사용자 정보 등을 카카오에 요청할 수 있다.
- 액세스 토큰이 만료되었다면 위 2.단계부터 다시 진행한다.