이번, 새로운 프로젝트를 진행하면서 로그인 기능을 추가해야 했다. 백엔드를 통해서 로그인 기능을 진행하는데 github oauth를 기반으로 작업했다. 사실 백엔드와의 기능을 추가하기 전에 파이어베이스 인증 탭을 이용해서 간단한 회원가입 폼을 만들어 본적이 있어서 쉽게 할 수 있겠다 예단했다. 그런데 엄청 고생했다.
결과적으론 잘 구현했다. 엄청난 삽질의 기록들 속에서, 이게 뭐고 저게 뭔진 모르겠지만 여기저기 블로그를 따라서 조합하니까 되긴 했다. 그런데 OAuth가 무엇이냐? 말하면 대답할 순 없었다. 그냥 구현만 했을 뿐. 그래서 이거 한번 정리해야겠다는 생각이 들었다.
OAuth는, 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.
ref : https://ko.wikipedia.org/wiki/OAuth
이 위키피디아의 정의를 보고 한문장씩 정리해보면,
OAuth는 Open Authorization의 준말이다.
인터넷 사용자들은 비밀번호를 제공하지 않는다.
다른 웹사이트 상의 자신들의 정보에 대해 접근 권한을 부여할 수 있는 공통적인 수단이다.
이는 접근 위임을 위한 개방형 표준이다.
그러면 실제로 무엇인가 알아보기 전에, 관련된 두가지 단어를 살펴보자.
인증은, 유저가 누구인지 확인하는 절차이다.
사용자가 자신이 사용자라고 주장할때, 그 사용자가 맞는지 확인하는 과정이다.
예를들어, 어떤 회사에 방문한 사람이 있다면 그 사람이 입장이 가능한지 자체를 확인하는 과정이다.
회원가입이나, 로그인 등에서 인증이 필요하다. 그리고 로그인이면 비밀번호가 필요하겠다.
권한을 부여하는 절차이다.
사용자가 접근하고 싶은 자원이 접근이 가능한지의 여부를 확인하고,
접근이 가능하다면 권한을 부여한다.
예를 들어, 어떤 회사에 접근이 가능한 부분이 권한에 따라 다르다면 특정 부분에 대한 권한을 부여하는 과정이다.
ref: https://dolphinsarah.tistory.com/44
사실 이부분을 글로 적으려고 열심히 노력했는데 뭔가 보기 힘든 것 같아서 그림을 그려봤다.
일단, 무엇보다도 인증이 이루어져야 할 것이다.
요즘 사이트들을 보다보면 아래에 google로 로그인, github로 로그인 등의 버튼이 자주 있다.
그걸 생각하면 이해하기 쉬웠다.
인가
가 필요한 Resource Server에 접근할 수 있다.위와 같은 과정에서, code를 얻는 과정까지는 프론트엔드 부분에서 처리했다.
그리고 그 code를 가지고 승인을 받아 access token을 발급받거나, access token을 통해 resource server에 접근하는 과정은 백엔드에서 처리했다.
근데 왜 나눴을까? 나눠야만 하는 이유가 있는 것일까? 그냥 해도 될것같은데..? 라는 이상한 생각을 잠깐 했는데
나누는 이유는 보안상의 이유였다. 사실 이걸 공부하기 전에 jwt 토큰을 공부했다. 그래서 jwt토큰에 대해서는 어느정도 느낌만 알고 있었다는데 이상하게 이거랑 연관짓질 못하고 있었다. (당연히 여길 모르니까 이해가 안가는게 당연했던 것 같다.)
프론트쪽에서, access token을 가지고 있다면 보안상의 문제점이 일어날 수 있을 것이다.
그런데, 이걸 백엔드에서 처리하게 되면 다음과 같은 프로세스가 진행된다. (사실 백엔드도 access token을 저장해두고 사용하는 것은 아니다)
서버만 아는 키로
해싱해서 프론트로 보내준다.결과적으로 백과 프론트 둘다 access token을 담고있지 않게 된다.
마치 홍철없는 홍철팀처럼 access token이 뭔진 모르지만 둘다 잘 사용할 수 있게된다.
이를 통해 보안상의 이점을 가지게 된다.
https://github.com/binghe819/TIL/blob/master/Network/OAuth%202.0/OAuth2.0.md#oauth%EC%9D%98-%ED%83%84%EC%83%9D%EA%B3%BC-%EC%82%AC%EC%9A%A9
https://github.com/codingspecialist/Springboot-JWT-React-OAuth2.0-Eazy
https://ko.wikipedia.org/wiki/OAuth
https://dolphinsarah.tistory.com/44