소셜 로그인 인증 방식을 구현할 때 OAuth 2.0이라는 기술로 구현한다.
이미 사용자 정보를 가지고 있는 웹 서비스(GitHub, google, facebook 등)에서 사용자의 인증을 대신해주고, 접근 권한에 대한 토큰을 발급한 후, 이를 이용해 내 서버에서 인증이 가능하다.
-> 유저는 웹 상에서 굉장히 많은 서비스들을 이용하고 있고 각각의 서비스들을 이용하기 위해서는 회원가입 절차가 필요하다. 그 서비스별로 ID와 Password를 다 기억하는 것은 매우 귀찮은 일!
OAuth 를 활용한다면 자주 사용하고 중요한 서비스들(google, github, facebook) 의 ID와 Password만 기억해 놓고 해당 서비스들을 통해서 소셜 로그인이 가능하다!
검증되지 않은 App에서 OAuth를 사용하여 로그인한다면, 직접 유저의 민감한 정보가 App에 노출될 일이 없고 인증 권한에 대한 허가를 미리 유저에게 구해야 되기 때문에 더 안전하게 사용할 수 있죠.
Resource Owner : 액세스 중인 리소스의 유저. 김민성의 구글 계정을 이용하여 App에 로그인을 할 경우, 이 때 Resource owner은 김민성.
Client : Resource owner를 대신하여 보호된 리소스에 액세스하는 응용프로그램. 클라이언트는 서버, 데스크탑, 모바일 또는 기타 장치에서 호스팅할 수 있다. 위의 예시에서는 app이다.
Resource server : client의 요청을 수락하고 응답할 수 있는 서버이다. 위의 예시로는 구글이 된다.
Authorization server : Resource server가 액세스 토큰을 발급받는 서버입니다. 즉 클라이언트 및 리소스 소유자를 성공적으로 인증한 후 액세스 토큰을 발급하는 서버. 이곳 역시 구글이다.
Authorization grant : 클라이언트가 액세스 토큰을 얻을 때 사용하는 자격 증명의 유형. 보안상 강화를 위해 먼저 Authorization code를 받아서 액세스 토큰과 교환한다.
Authorization code : access token을 발급받기 전에 필요한 code . client ID로 이 code를 받아온 후, client secret과 code를 이용해 Access token 을 받아온다.
Access token : 보호된 리소스에 액세스하는 데 사용되는 credentials. Authorization code와 client secret을 이용해 받아온 이 Access token으로 이제 resource server에 접근을 할 수 있다. 문자열 타입으로 되어있다.
Scope : scope는 토큰의 권한을 정의한다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위이다. 리소스 유저가 원하는 파일을 얻기위한 권한을 정의한다.
(출처: 내 손, 내 머리!)
clinet가 액세스 토큰을 얻는 방법
그 중에 중요한 것은 Authorization grant type과 refresh token grant type이라고 한다.
액세스 토큰을 얻을 때 사용하는 자격증명. 보안상 강화를 위해 먼저 Authorization code를 받아서 액세스 토큰과 교환한다.
(출처: 내 손, 내 머리!)
리프레시 토큰을 얻을 때 사용하는 자격증명
(출처: 내 손, 내 머리!)
다이어그램을 그리기 전에는 원리가 이해가 되지않아 코드를 작성할 때에도 정말 어렵게 느껴져서 테스트케이스에 맞추다 싶이 에러코드를 보고 문제를 해결했었다. 그러나 다시 용어와 순서를 정리하고 나니 내가 스프린트에서 작성한 코드들이 다시금 떠오르면서 순서가 명확히 정리되어서 머리가 좀 아프지만 기분이 좋다. 인증 부분이 살짝 흥미가 떨어질뻔 했는데 인증절차에 대해서 보안을 위해 이정도로 코드와 토큰을 사용하는 것을 알고나니 신기하고 재미가 붙은 것 같다.