구글의 OAuth에 대해서 ( + 액세스토큰 로그인 방식 )
인증용어
리소스오너 : 사용자
클라이언트 : 사용자가 사용할 앱
리소스서버 : 구글서버
코드 : 클라이언트가 해당 서비스(구글카렌더등)를 이용하기 위한 인증코드이며 사용자가 화면에서 허가한다
액세스토큰 : 클라이언트앱이 리소스서버로부터 인증받으면 발급되는 토큰 (보통 클라이언트에서 한시간 정도 보관하고 리소스서버에서 폐기함)
SDK : 구글등의 리소스서버가 제공하는 인증 라이브러리(클라리언트에서 개발시 사용)
클라이언트ID/시크릿키 : 리소스서버로부터 클라이언트앱 인증용
스코프리스트 : 클라이언트앱에서 리소스서버에 사용할 기능리스트(카렌더 보기,카렌더 다운로드등..)
구글의 카렌더 기능을 클라이언트에서 사용하는 과정
-
리소스오너(사용자)가 해당 클라이언트(앱)를 사용하기위해 해당 클라이언트의 화면을 연다
-
리소스오너가 구글에 로그인되어있지않다면 로그인을 요구한다
-
리소스오너가 로그인 되었다면 클라이언트가 카렌더 기능을 사용하도록 허가하겠냐고 묻는다
(클라이언트는 리소스서버로부터 발급받은 클라이언트ID와 시크릿키를 가지고있는 상태)
-
위의 내용이 확인되면 리소스서버(구글)가 클라이언트에게 코드라는 것을 보낸다
-
클라이언트는 받은 코드와 클라이언트ID와 시크릿키 3개를 리소스 서버에 보낸다
-
위의 5번의 과정으로 클라이언트는 구글에게 허가받은 앱임을 클라이언트ID/시크릿키을 통해서 인증하고, 해당 카렌더 서비스를 사용 가능할수있음을 코드를 통해서 인증할수있다
-
클라이언트ID와 시크릿키 코드를 받은 리소스서버는 클라이언트에게 액세스키를 발급하고 클라이언트는 이를 저장한다
-
클라이언트는 리소스서버에 액세스토큰을 사용해서 사용자의 구글 카렌더 데이터를 받아온다
-
앞서서 받아온 카렌더 데이터를 클라이언트는 리소스오너(사용자)에게 보낸다
Client Id / Secret Key 에 대해서 ( 0528추가 )
- Client ID : 내가 OAuth를 사용할 웹 어플리케이션을 구별할 수 있는 식별자이다. 노출되어도 된다 ( 내 프로젝트의 고유의 ID라고 생각하면됨 )
- Client Secret : 위의 Client ID에 대한 비밀키이다. 절대 노출해서는 안된다.
OAuth란
사용자가 Google이나 Facebook의 소셜 계정으로 외부 어플리케이션에 간단히 회원가입/로그인/사용 할수있는 기능이다
또한 해당 외부 어플리케이션에서 Google과 Facebook이 제공하는 기능을 간편하게 사용가능하다 ( ex: 구글 카렌더 )
액세스토큰
-
권한 확인을 위해서 사용됨
-
액세스토큰을 구현하는 방식중에 하나가 JWT이다 ( 내 사이트 JWT 정리참조 )
-
jwt는 비대칭키를 사용하므로 클라이언트에 인증정보를 저장가능하다
-
기본적으로 세션을 이용한 로그인 방식과 다르다 ( 내 사이트 세션 로그인방식 정리 참조 )
-
세션로그인 방식은 유저의 인증정보를 서버에 저장하여 서버의 부하를 늘리지만
액세스토큰 방식은 유저의 인증정보를 클라이언트에 저장하기때문에 서버의 부하가 적다
- 서버와 클라이언트 사이에 엑세스 토큰을 주고 받을때 헤더의 Authorization에 아래와 같이 설정한다
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${accessToken}`
}
참조