Google Login, Google People Api 로 사용자의 구글 계정 정보를 알아내보자~ 1편
배경
구글 로그인을 하면서 사용자의 전화번호, 성별 등 정보를 함께 얻을 수 있는지 알아보게되었다.
본격적으로 구현에 들어가기 전에 관련 개념을 알아야 할 필요가 있다.
이번 1편에서는 개념에 대한 설명을 먼저 하도록 하고, 2편에서 실제 구현을 어떻게 하는지 설명하도록 하겠다!
OAuth 2.0 ?
사용자가 자원(ex. 구글 계정 정보) 에 대한 접근 권한을 부여하고 다른 서비스에서 그 자원에 접근할 수 있도록 해주는 권한 부여 프로토콜
카카오, 구글, 네이버 등 어떤 서비스에서 그 서비스의 자원에 내가 만든 서비스가 접근할수있도록 권한을 부여하는 프로토콜
OAuth 2 를 이해하는데 알아야 할 용어를 아래에 정리한다.
용어 | 설명 |
Resource Owner | 서비스를 이용하는 유저를 뜻한다. (ex. 김도연) |
Service Server (서비스 제공자) | Client 라고도 한다. Resource Server(API Server) 에게 필요한 자원(사용자 정보) 를 요청하고 응답받기도 한다. (ex. 도여니가 만든 Spring Server, 구미인사이더 서버 등) |
Authorization Server | 인증에 사용할 권한을 부여해주는 서버. Resource owner 는 이 서버로 id, pw 를 넘거 Authorization code 를 받은 후, 서비스 제공자에게 넘긴다. (ex. 구글...) |
Resource Server | OAuth2 서비스를 제공하고 리소스를 관리하는 서버 (ex. 구글, 카카오, 네이버..) Authorization Server와 별개로 구분되어 있기는 하지만, 하나의 서버로 구현할지 따로 구현할지는 개발자가 선택하기 나름이라고 한다. |
Scope | 사용자 데이터에 특정한 데이터만 접근할 수 있도록 제한할때 사용한다. 클라이언트가 권한 부여 서버로 요청 보낼때 이 스코프를 같이 보내게 된다 (ex. 성별 스코프, 전화번호 스코프) 그럼 사용자에게 허가를 받는 화면에는 위에서 날린 스코프와 관련된것만 동의받도록 나온다 예를들어 스코프로 전화번호 스코프만 날렸으면 사용자에게 전화번호 관련 정보에 대한 동의 화면이 나타난다. 그리고 날리지 않은 성별에 대한 동의는 안나온다. 성별 정보도 못읽는다. |
OAuth2 에는 두가지 플로우가 있다.
1. 권한 부여 플로우
-> 엑세스 토큰을 탈취하게되면 일정 기간동안 리소스에 접근을 할수있게됨
-> 따라서 이 엑세스토큰을 얻는것, 사용하는것을 백엔드로 넘겨 좀더 보안성 있게 한 플로우
2. 묵시적 플로우
백엔드 서버가 따로 없고 클라이언트만 있을때 사용하는 플로우
클라이언트에서 바로 엑세스토큰을 받고 이 엑세스토큰으로 리소스에 접근
엑세스토큰 탈취의 위험이 있으나 여전히 많이 사용되고 있는 방식.
OpenID Connect(OIDC)
OpenID Connect 는 OAuth2를 확장하여 만든것
OAuth2랑 다른 점?
OAuth의 주요 목적은 인가(자원에 대한 접근 권한),
Open ID의 Id Token에는 유저에 대한 신원 정보가 담긴다. 누구인지 신원을 증명할수 있을 뿐 Id Token으로 자원 접근 권한을 얻지는 못한다. 인증을 하는것임(신원 검증)
즉 OAuth2 는 서버에게 리소스를 가져오기 위한 엑세스 토큰 확보에 목적이 있고, Open ID Connect는 사용자 신원 정보가 담긴 ID Token 확보에 목적이 있는것
전체 과정
1. 구글 로그인을 통해 ServerAccessToken발급
2. 구글에 oauth2 엑세스토큰 발급 요청
3. 발급받은 엑세스토큰을 people api 에 전달하여 사용자 성별 등 정보를 받는다.
일종의 암시적 플로우를 따른다고 봐야할듯??
2번 과정에서 백엔드만 가지고있어야 할 client secreat 을 앱에서 가지게되는데 이부분이 걱정된다. .
참고
https://auth0.com/blog/id-token-access-token-what-is-the-difference/
https://medium.com/@sunyi233/id-token%EA%B3%BC-access-token-d285e647ee23
https://devvkkid.tistory.com/233#google_vignette
https://iamhmin.github.io/oauth/oauth-4/
https://developers.google.com/identity/protocols/oauth2/native-app
https://hello-backend.tistory.com/187