개요
글의 접근성을 높이기 위해 엄청나게 쉽고, 간단하게 작성하였음을 먼저 밝힙니다. 사실, 다른 사람이 짠 코드를 (아무런 문서가 없는) 자신에게 맞게끔 수정하고, 적용하는것은 많이 어렵고 까다롭습니다. 이 점을 먼저 확인하고, 다음의 글을 읽어나가면 도움이 될 것 같습니다.
프로그램을 개발
하기 위해 가장 먼저 개발이 되는 것은 가히 로그인
이라 말할 수 있습니다. 로그인과 회원가입은 매 프로젝트 마다 개발이 되어져야하는, 매우 번거롭고 귀찮으며, 최근 트렌드에 맞추는 것은 상당한 귀찮음이 따라오게 됩니다. 이에, 보통은 다른 사람들이 사전에 개발한 프로그램이나 오픈소스로 구현된 것을 들고와서 개발합니다. 하지만, 오픈소스로 구현된 것을 활용하게 된다면 라이센스로 인한 코드 공개 의무가 발생하거나, 유료 정책으로 인해 더 번거로워지거나 심각한 의존성이 발생할 수 있습니다. 그래서 직접 구현하거나, 직접 개발한 내용을 다시 활용하기도 합니다.
본 글에서는 필자가 OAuth2.0 을 통한 로그인 프로그램 개발 할 때 어떻게 구현하였는지 설명하는 것이 핵심 내용입니다. 필자의 경우에는 OAuth2.0을 통한 로그인이 분명히 어딘가에 구현이 되어 있을거라 생각하였고, 오픈소스 프로젝트를 활용하여 로그인 서비스를 제공하였지만, 라이센스 문제와 기능 특정(Naver OAuth)가 누락되어 있어 직접 구현하게 되었습니다.
개발 흐름
먼저, OAuth2.0 로그인 서비스를 위해 사용된 오픈소스는 Supabase(Github) 입니다. 다만, Supabase
가 Kubernetes
가 아닌 docker-compose
형태로 제공이 되고있다 보니, kubernetes
를 위한 yaml
파일을 작성하여 테스트를 진행하게 되었습니다. 이때, OAuth2.0
을 제공되고 있던 목록들이 많았지만, 원하던 Naver
가 없었기도 했지만, Self Hosting
에서는 OAuth
를 통한 Authentication
이 지원하지 않았다는 점입니다.
그래서 직접 구현하는것이 더 옳바르다고 생각하게 되었고, Supabase
에서 제공하는 기능들이나, OAuth2.0
를 구현한 오픈 소스를 가져와서 커스텀하는 것이 더 빠를것이라 판단하였습니다.
실제로, Supabase
에서 사용하는 OAuth
관련 라이브러리/프로그램은 MIT 라이센스로, gotrue 오픈소스 였다는 점이였습니다. gotrue
는 Go
언어로 작성된 Supabase
를 위한 OAuth
프로그램이였기에, 간단하게 코드를 수정한다면? Supabase
에서 만든 OAuth
기능을 온전히 사용할 수 있지 않을까? 라는 생각하게 되었습니다.
당연하게도, 처음에는 gotrue
를 바로 사용하는것이 가능했다면 쉬웠겠지만, gotrue
는 supabase
를 타겟으로 만들어졌다 보니, 불필요한 코드와 함께 강한 커플링이 되어져 있었기에, gotrue
를 온전히 사용하기 어렵다고 판단하였습니다. gotrue
의 코드를 분석하여 새롭게 나의 솔루션에 맞는, 커스텀화가 되어져 있는 프로그램을 개발하게 되었습니다.
실제 개발
안타깝게도, gotrue
에는 문서화가 전혀 되어있지 않았습니다. 필자의 특기인 다른사람의 코드를 분석 및 수정하기가 많은 도움이 되었습니다. 먼저, Oauth
가 구현되어져있는 facebook
, gitlab
, kakako
는 프로젝트 어딘가에 파일명이나, 함수 명으로 존재할 것이기 때문에 검색하여 찾는 것을 우선시 하였습니다. code 그래서, 아하! 해당 코드만 복사해서 오류가 나지 않게 수정한다면 완벽하겠군! 이라 판단하여, 해당 폴더에 있는 모든 내용을 복사한 다음, 빌드 오류가 나지 않도록 적절히 수정을 해주었습니다.
결과적으로는 gotrue
에서 구현되어져 있던 모든 OAuth
코드를 가져와서 실행할 수 있었고, Naver
의 OAuth
도 적절하게 추가할 수가 있었습니다.
다행이도, 대부분 프로그램들이 CLI 환경에서 동작하는 프로그램의 라이센스는 자유롭게 하되, GUI와 관련된 프로그램은 유료 라이센스 정책으로 하는 덕분에 충분히 가능했었습니다.
개발 시간
대부분의 OAuth를 들고와서 Client Key
와 Secret Key
, Redirect URI
만 기입한다면 모두 동작하도록 만들 수 있었습니다. 또한, 이전에 개발이 되어져 있떤 gotrue
를 들고와서 필자의 프로젝트에 맞게 개발까지는 만 4시간 걸렸을 때, 1개의 Oauth 로그인이 되는저 PoC를 진행하였고, 만 6시간 정도 지났을 때, 모두 동작하는 것을 확인하였습니다. 그 정도로 엄청나게 짧은 시간 내에 개발 할수 있을 정도로, 개발 시간을 단축이 가능했습니다.
첨언
직접 모든것을 개발하거나, 이미 만들어져 있는 오픈소스를 들고와서 사용하는 것이 아니라, 원하는 기능만 들고와서 사용하는 것은 어떨까요?