최근 많은 웹 사이트에서 구글, 트위터, 페이스북 등 외부 SNS 계정을 통해 간편히 회원가입 및 로그인 할 수있는 기능을 제공한다. 이처럼 제3자의 서비스에게 사용자의 접근 권한을 위임 받을 수 있게 하는 방식을 OAuth 2.0(Open Authorization 2.0)이라고 한다. 쉽게말하면 타사 플랫폼(카카오, 트위터, 구글 등)으로부터 우리의 서비스를 사용하고자 하는 유저의 정보에 접근 할 수 있는 권한을 위임 받는것이다.
OAuth 참여자는 크게 세가지로 구분 할 수있다.
● Client : 타사 플랫폼에 접근하려는 웹 어플리케이션
● Resource Owner : Client가 제공하는 서비스를 통해 로그인하는 실제 유저
● Resource Server : Client가 제어하고자 하는 자원을 보유하고 있는 서버 (Facebook, Google, Kakao 등)
이때 Client는 Resource Server를 이용하기위해서는 자신의 서비스를 등록하여 사전 승인을 받아야한다.
(등록절차를 통해서 Client ID, Client Secret, Authorized redirect URL 등의 정보를 부여 받을 수 있다.)
많이들 사용하는 카카오의 로그인 과정의 시퀀스 다이어그램은 다음과 같다.
1. Client에서 카카오 인증서버로 '인가 코드'를 요청하면 카카오 서버에서 Resource Owner, 즉 사용자에게 로그인을 통한 인증을 요청한다. 인증을 통해 카카오 서버에서는 '인가코드'를 쿼리 스트링을 통해 Client에게 전달해준다. (하지만 해당 과정만으로 로그인에 성공하는게 아니다.)
2. 전달받은 '인가코드'를 통해 '토큰 발급'을 요청한다.
3. 토큰 발급이 완료되면 해당 토큰으로 사용자의 정보 조회를 할 수 있으면 이후 로그인 및 가입 처리를 할 수있다.
※ 그렇다면 1번 과정의 '인가코드'를 발급하지 않고 곧바로 Client에게 토큰을 발급해줘도 되지 않을까?
- 인가 코드를 발급하는 과정을 생략하고 Redirect URI를 통해 토큰을 전달하면 URL 자체에 데이터를 실어 전달 할 수 밖에 없으므로 토큰이 곧바로 노출된다. 이러한 보안 사고를 방지하기위해 인가코드를 발급하고, 발급받은 코드를 백엔드로 전달하여 토큰을 발급 받아야한다.
참고: 카카오 Developers 카카오 로그인(https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api),
hudi.blog, OAuth 2.0개념과 동작원리 (https://hudi.blog/oauth-2.0/)