[Tech]OAuth 2.0을 사용한 윙잇 SNS 로그인 구현 방식

2023-05-12


서비스를 더 간편하게, 더 안전하게 만들고 있어요!

✍🏻 김보현 | 개발팀

최근 저희 팀에서는 SNS 로그인을 통한 간편가입 관련 개발 프로젝트를 진행해왔습니다.

윙잇 서비스의 SNS 로그인 및 가입 프로세스는 OAuth 2.0 기반으로 제공하는데요, 구체적으로 OAuth 2.0이란 무엇인지, 또 이를 통해 SNS 가입이 어떤 절차로 진행되는지 설명하고자 합니다.


OAuth 2.0 이란?

용어부터 알고 갈게요! OAuthOpen Authorization의 약자로다양한 플랫폼 환경 내 인증 및 권한 부여를 위한 산업 표준 프로토콜을 말해요. 인터넷 사용자가 비밀번호 제공 없이, 다른 웹사이트 상의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여하는 공통 수단으로 사용되는데요. 아마존, 구글, 페이스북, 마이크로소프트, 트위터 등 여러 기업이 이 메커니즘을 사용 중이며, 사용자들이 타사 애플리케이션이나 웹사이트 계정에 관한 정보를 공유할 수 있도록 허용하고 있습니다.
*출처 : wikipedia

OAuth 2.0 승인 프레임워크를 사용하면, 타사 애플리케이션이 리소스 소유자 및 HTTP 서비스 간의 승인 상호작용을 조정합니다. 리소스 소유자 대신 액세스하거나 타사 애플리케이션이 자체적으로 액세스하도록 허용해, HTTP 서비스에 제한적으로 액세스하도록 할 수 있습니다.
*출처 : IETF OAuth 2.0 사양



윙잇 서비스 회원가입 페이지

윙잇 서비스는 외부 서비스 계정으로 로그인하는 방식을 제공합니다. 하지만 만약 외부 서비스 계정 정보가 윙잇 서비스에 안전하게 제공되지 않으면 사용자의 보안에 위협이 됩니다. 또 윙잇 서비스가 이를 적절히 관리하지 못하면 정보 유실 등의 큰 문제가 발생하게 되죠.

이 점을 막기 위해 윙잇 서비스는 OAuth 2.0 프로토콜을 통한 인증 및 권한 부여를 제공해요. OAuth 2.0은 안전한 인증을 위해 SSL/TLS 프로토콜을 사용하고, 사용자 정보를 권한 부여된 범위 내에서만 사용할 수 있게 제한하고 있고요. 또 사용자가 제3자 애플리케이션에서 자신의 정보를 안전하게 사용할 수 있게 보안 기능을 제공합니다.

그 덕분에 윙잇 서비스는 사용자가 카카오, 네이버, 페이스북, 구글 등의 외부 서비스 계정으로 로그인할 때, 안전하게 사용자 정보를 전달받고, 이를 보호하며, 정보 유실 등의 문제를 예방하고 있답니다.


OAuth 2.0 요소

OAuth 2.0 요소는 크게 4가지로 구성되어 있어요.

  • Resource Owner : 자원 소유자로, 보호되어야 하는 리소스에 대한 접근 권한을 부여할 수 있습니다.
  • Client : 보호된 리소스에 접근하고자 하는 애플리케이션 또는 서비스입니다.
  • Resource Server : 보호되어야 하는 리소스를 저장하고 보호하며, 요청된 데이터를 제공합니다.
  • Authorization Server : Resource Owner의 인증 및 권한 부여를 처리하며, Client가 리소스에 접근할 권한을 얻을 수 있게 합니다.


OAuth 2.0 권한 부여 방식

어떻게 AccessToken 값을 받아오는지에 대한 방식을 말해요. AccessToken 값으로 Client(윙잇)가 사용자의 SNS 계정 데이터를 받아올 수 있기 때문이죠.



OAuth 2.0에서 지원하는 권한 부여 방식 4가지는 아래와 같습니다.


1. Authorization Code 방식

Client 애플리케이션이 사용자를 제3자 서비스에 리디렉션 시키는 방식이에요. 사용자는 제3자 서비스에서 인증을 하고, 인증이 성공적으로 완료되면 제3자 서비스는 Client로부터 제공받은 redirect_uri로 인증 코드를 보냅니다. 이 인증 코드를 이용해 Client 애플리케이션은 제3자 서비스의 Token 엔드 포인트로 AccessToken을 요청합니다. 이때, Client는 Client ID와 Client Secret을 함께 보내는데, 이 정보는 Client의 신원을 검증하는 데 사용됩니다. 서버는 이 정보를 검증한 후, 유효한 경우 AccessToken을 반환합니다.

이 방식은 안전하고 보안성이 높아, 보호되어야 하는 리소스에 접근하려는 Client가 사용자의 동의를 받아 인증 및 권한 부여를 받아야 하는 경우에 적합해요. 윙잇 서비스는 사용자의 개인정보를 다루기 때문에, 해당 방식으로 사용자의 개인정보를 보호하고 안전하게 처리하고 있습니다.


2. Implicit 방식

주로 Client 애플리케이션이 서버에게 인증 요청을 보내면, 서버가 바로 AccessToken을 응답으로 반환하는 방식이에요. Authorization Code 방식과 달리 Client 애플리케이션이 서버에게 인증 코드를 요청하는 단계가 없어 더 간편합니다. 하지만 AccessToken이 URL 파라미터로 반환되기 때문에 보안상 취약점이 존재합니다. 그래서 Client 애플리케이션이 공개적으로 접근 가능한 리소스에 대한 인증을 처리할 때 주로 사용되죠. 보안이 필요한 리소스에 대한 인증에는 적합하지 않아, 사용자의 개인정보를 다루는 윙잇과 같은 서비스에서는 사용하지 않는 게 좋습니다.


3. Resource Owner Password Credentials 방식

Client가 사용자의 아이디와 비밀번호를 직접 받아 인증을 수행하는 방식이에요. Client가 사용자의 자격 증명을 가지고 인증 서버에 직접 요청하기 때문에, Authorization Code나 Implicit 방식처럼 사용자를 인증 페이지로 이동시키지 않고 바로 인증을 수행할 수 있죠. 하지만 사용자의 자격 증명이 Client에서 처리되므로 보안상의 위험이 존재합니다. 따라서 이 방식은 Client와 인증 서버 간의 신뢰성이 보장되는 경우, 가령 동일한 조직 내에서만 사용하는 경우와 같이 보안이 강화된 내부 시스템에서 주로 사용되죠. 그 외에는 위험 요소가 있어 권장되지 않고 있습니다.


4. Client Credentials 방식

Client 애플리케이션이 인증서버로부터 발급받은 Client ID와 비밀번호를 사용해 인증하고, 인증이 완료되면 AccessToken을 직접 발급받아 사용하는 방식이에요. Client 애플리케이션이 사용자 대신 서비스에 접근하는 경우에 사용되죠. 예를 들어 2개 서비스 간의 인증이 필요한 경우 이 방식을 통해 서로 간의 인증을 수행할 수 있습니다.

Client Credentials 방식은 인증 과정에서 사용자를 참여시키지 않기 때문에, 사용자에 대한 정보가 필요하지 않거나, 이미 Client 애플리케이션에 저장된 정보를 사용해야 하는 경우 유용합니다. 일반적으로 서비스 자원에 대한 접근 제어와 같은 내부 서비스 간 인증에 많이 사용됩니다.


윙잇의 OAuth 2.0 사용 방식

앞에서 설명드린 4가지 방식 중 윙잇은 Authorization Code 방식을 사용하고 있습니다.
사용자가 윙잇 서비스를 이용하기 위해 SNS 로그인을 선택하면, SNS 인증 서버에서 사용자 정보를 확인하고 윙잇 서비스에 권한 부여를 요청합니다. 윙잇 서비스는 사용자가 부여한 권한을 가지고 최종 사용자의 데이터를 요청해 SNS 로그인을 완료하게 되죠.

만약 사용자가 카카오톡 로그인 버튼을 누르면, 카카오톡 인증서버에서 사용자 정보를 확인한 후, 윙잇은 권한부여를 받기 위해 카카오톡 서비스 redirectURL으로 호출됩니다.


사용자는 들어간 SNS 창 안에서 윙잇 서비스가 요청하는 권한 부여 요청 창을 보게 됩니다. 동의 버튼을 누르면, Callback URL을 통해 윙잇에게 권한이 부여되고, 윙잇은 Authorization Server에게 AccessToken을 요청합니다. AccessToken을 받은 윙잇은 SNS에 최종 사용자의 데이터를 요청하고, 이를 통해 SNS 로그인이 완료됩니다. 이 과정에서 사용자의 권한이 요청되고, 윙잇은 해당 권한 범위 내에서만 사용자의 정보를 사용할 수 있어요. 사용자의 정보를 보호하면서 외부 서비스 계정 정보를 안전하게 활용할 수 있는 셈이죠.


글을 마치며

지금까지 윙잇에서 SNS 로그인을 할 때 사용되는 OAuth 2.0에 대한 내용을 정리해 보았습니다.

중심이 되는 내용 위주로 최대한 어렵지 않게 작성하려고 했는데요, 익숙하지 않으신 분들에게는 다소 복잡해 보일 수 있을 것 같아요. 하지만 이 글이 인증 프로토콜의 대표격인 OAuth 2.0를 이해하는데 조금이라도 도움이 되었으면 합니다. 감사합니다. 😊