OAuth 란
OAuth("Open Authorization")는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. 이 매커니즘은 여러 기업들에 의해 사용되는데, 이를테면 아마존, 구글, 페이스북, 마이크로소프트, 트위터가 있으며 사용자들이 타사 애플리케이션이나 웹사이트의 계정에 관한 정보를 공유할 수 있게 허용한다.
OAuth를 선택하게 된 배경
일상 속 여러 서비스에서 카카오, 네이버, 구글 등을 통한 간편 로그인을 이용하면서 OAuth를 통한 로그인 기능을 구현해보고 싶은 마음이 있었다. 하지만 여러 프로젝트를 진행하면서 OAuth를 구현할 기회는 있었지만, CRUD API 구현을 하다 프로젝트가 끝나버려 OAuth 로그인을 구현하지 못했던 게 아쉬워 이번 프로젝트에서는 클라이언트 개발자 분들과 상의하여 OAuth를 구현을 먼저 해보게 됐다.
Github OAuth Flow
Web Flow

Device Flow

web flow, device flow 중 나는 web flow로 OAuth를 구현해보게 됐다. 현재 진행하고 있는 프로젝트는 iOS 앱 개발이지만 클라이언트 분들이 safari를 거쳐 발급된 token을 앱으로 전송하는 방식으로 OAuth를 구현하고자하여 앱 개발이지만 web flow로 개발을 진행해보았다.
구현 과정
나는 OAuth flow를 이해하고자 기존에 정리된 글들을 찾아 비교적 간단한 방법으로 OAuth를 구현해보았다. 처음 Github OAuth 로그인 창을 볼 수 있었던 건 해당 자료를 참고하여 구현해보았을 때다.
https://gist.github.com/blossun/5057cf64f85b809fd76c1c1c750e8cdf
Github OAuth 기능 구현
Github OAuth 기능 구현. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
OAuth에 대한 부족한 지식은 생활코딩의 OAuth 강의를 들으며 보충해가며 구현해볼 수 있었다.
https://opentutorials.org/course/3405
WEB2 - OAuth 2.0 - 생활코딩
수업소개 사용자가 가입된 서비스의 API에 접근하기 위해서는 사용자로부터 권한을 위임 받아야 합니다. 이 때 사용자의 패스워드 없이도 권한을 위임 받을 수 있는 방법이 필요합니다. 이를 위
opentutorials.org
Github Developer app으로부터 client_id와 client_secret을 발급받고, 해당 app에 저장된 Homepage URL, Authorization Callback URL을 통해 Auth Code를 받아 그 code로 Auth Server에 접근하여 Access Token을 받아온다.
token을 이용해 유저 정보를 가져올 수 있게 되고 유저 정보는 DB에 업데이트되거나 저장되게 된다.
유저 정보와 만료 시간을 가진 Jwt 토큰을 만들어 클라이언트에게 응답해준다.
이 흐름으로 구현하여 클라이언트에게 전달하기까지 약 2주의 시간을 보냈다. 3주짜리 프로젝트에서 2주를 하나의 기능 구현을 위해 시간을 사용한 건 지금 생각해보면 효율적이지 못했다고 생각한다. 하지만 구현 과정에서 다양한 경험을 할 수 있었다.
HttpRequest 처리하기 위해 WebFlux 라이브러리의 WebClient 사용하기에는 WebFlux 라이브러리는 너무 거대할 수 있다. 그로인해 다른 Http Client 라이브러리는 없었는지 찾아볼 수 있었고, 내가 구현한 로그인이 WebClient의 Non-blocking이 정상적으로 작동하게끔 설계되었는지, Client Secret과 같은 중요한 정보는 소스 코드로 관리하면 안 된다 등등 OAuth 구현을 하면서 코드 작성에 있어 라이브러리 사용도 제대로 알고 사용하고, 근거 있는 코드를 작성해야한다는 깨달음 또한 얻을 수 있었다. 나아가 로그인을 통한 유저 정보를 왜 Jwt를 사용하여 클라이언트에게 전달해야 했는지 생각해 볼 수 있었다.
느낀점
이러한 부분은 리뷰어를 통해 지적(?)을 받고서야 생각해보게 된 것이라 스스로 깨달았다고는 볼 수 없다. 하지만 앞으로 코드를 작성할 때나 기술을 선택할 때 왜 필요한 지 생각해보고 타당한 이유를 갖고 사용해야겠다는 생각을 뼛 속 깊이 새길 수 있었다. 시간은 꽤나 걸렸고 필터나 인터셉터가 없어 반쪽짜리라고 볼 수 밖에 없는 로그인이지만, 개인적으로 이번 프로젝트에서 꼭 구현해보고 싶은 기능이었기에 Jwt 토큰을 전달하였을 때 스스로가 뿌듯한 경험을 할 수 있었다.
참고 자료
https://ko.wikipedia.org/wiki/OAuth
OAuth - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org
https://github.com/nathan29849/airbnb/wiki/Backend
GitHub - nathan29849/airbnb: 그룹 프로젝트 #4 team-15
그룹 프로젝트 #4 team-15. Contribute to nathan29849/airbnb development by creating an account on GitHub.
github.com