가볍게 참여할 수 있는 서비스를 위해 OAuth 를 도입하였다. 대표적으로 많이 사용하는 Google, kakao 를 먼저 도입 후 필요에 따라 추가할 예정이다. OAuth 를 도입하기 위해 선택한 환경들은 다음과 같다.
인증 서버의 분리
서비스의 규모가 커짐에 따라 두벅스에서 제공하는 서비스가 추가되는 경우를 위해 인증 서버를 분리하였다. 인증 서버는 OAuth 의 기능이 구현되어 있으며 받아온 토큰을 Redis 에 저장하는 것까지 구현할 예정이다.
Spring security
인증 관련된 부분의 구현을 쉽게 하기 위해 선택하였다.
Redis
서비스를 시작하려면 가장 먼저 로그인 과정이 필요한 만큼 토큰을 저장하고 조회하는 과정이 빈번할 것이라 예상하여 MySQL 보다 가벼운 Redis 를 선택하였다. 만료기간이 존재하는 토큰의 특성을 Redis 에서 관리할 예정이다.
PAYCO 에서 OAuth 의 과정을 설명한 그림중에 가장 자세하게 나와있어 가져와보았다.
큰 흐름으로 보면 먼저 사용자가 인증 요청
을 한다. 그러면 사용자에게 OAuth 페이지가 반환되는데 사용자가 직접 이메일과 비밀번호를 입력하기 때문에 서버에서는 이를 관리할 필요가 없어진다. (이메일은 식별용으로는 필요하다) 또한 이미 회원가입 되어있는 OAuth 서비스를 이용하기 때문에 사용자는 회원가입이 아닌 로그인으로만 접근하면 되어 불필요한 과정이 하나 더 생략이 된다.
OAuth 서버에서 사용자가 입력한 이메일과 비밀번호를 보고 계정이 올바르게 입력되었으면 Authorization Code
를 발급한다. 이는 나중에 서버에서 로그인 요청을 한 사용자가 이전에 로그인 과정을 올바르게 거쳤는지 확인하는 용도이다.
서버는 Authorization Code 를 보고 OAuth 서버로 로그인이 성공적으로 되었음을 알리고, Access Token
을 받는다. 이후의 로그인이 필요한 요청에서는 이 토큰으로 대체한다.
각 기능별로 수행하는 역할을 보면 다음과 같다. 여기서 사용자
는 실제로 서비스에 접속하려는 사용자이며, 서비스
는 내가 구현하는 서버이다. PAYCO 인증 서비스
가 OAuth 서버라고 보면 된다.