팀에서 소셜로그인을 적용해보자는 의견이 있어서 개인 프로젝트 주차에서 카카오 로그인 구현을 해봤기에 관련 내용을 더 찾아보았다.
우리는 인터넷을 사용하면서 쇼핑몰등에서 회원가입 시 아래와 같은 이미지를 자주 접했다.
Facebook, kakao, naver, Google 등의 외부 소셜 계정을 기반으로 간편하게 회원가입 및 로그인할 수 있다. 클릭 한번으로 간편하게 로그인할 수 있을 뿐만 아니라 연동되는 외부 웹 어플리케이션에서 Facebook, kakao, Naver, Google 등이 제공하는 기능을 간편하게 사용할 수 있다는 장점이 있다.
예로 naver로 로그인하면 API를 통해 연동된 계정의 캘린더, 연락처, 쇼핑내역을 가져와 사용자에게 보여줄 수 있다.
이때 사용되는 프로토콜이 OAuth이다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. (위키백과)
OAuth는 다른 서비스의 회원정보를 안전하게 다른 서비스의 정보를 우리 서비스에게 건데주기 위한 방법이다.
구분 | 설명 |
---|---|
Client | 보호된 자원을 사용하려고 접근 요청을 하는 애플리케이션 |
Resource Owner | 웹 서비스를 이용하려는 유저, 자원(개인정보)을 소유하는 자, 사용자 |
Resource Server | 사용자의 보호된 자원을 호스팅하는 서버 |
Authorization Server | 권한을 부여(인증에 사용할 아이템 제공)하는 서버 인증/인가를 수행하는 서버로 클라이언트의 접근 자격을 확인하고 Acces Token을 발급하여 권한을 부여하는 역할 |
Access Token | 자원에 대한 접근 권한을 Resource Owner가 인가하였음을 나타내는 자격증명 |
Refresh Token | Access Token은 보안상 만료기간이 짧기 때문에 얼마 지나지 않아 만료되면 사용자는 다시 로그인을 시도해야 하지만 Refresh Token이 있으면 Access Token이 만료될때, Refresh Token을 통해서 Access Token을 재발급 받아서 다시 로그인할 필요가 없게 됨 |
OAuth의 핵심은 Access Token이다. 이 Access Token은 임의의 문자열 값인데, 이 문자열의 정체는 이 토큰을 발급해준 서비스만 알 수 있다. 물론 JWT의 경우 기본정보가 Base64인코딩으로 되어 있어서 정보를 살펴볼 수 있긴 하지만 기본적으로 Access Token은 토큰을 발급해준 서비스가 알고 있다고 생각하면 된다.
이 Access Token을 이용해, 이 토큰값과 관련된 고객의 정보를 우리는 해당 서비스에 요청할 수 있다. 해당 서비스는 이 토큰을 검증하고, 발급된게 맞다면 해당 고객의 정보를 넘겨준다.
즉 Access Token의 존재 자체가 고객이 정보를 넘겨주는 것을 동의함의 징표라고 할 수 있다.
Access Token을 넘겨주면 네이버는 정보를 넘겨준다. 참 쉽다. 이걸 위해서 우린 OAuth를 사용한다.
그러면 우리는 Access Token을 어떻게 네이버로부터 받을까? 당연히 네이버가 줘야한다...
특정 고객의 Access Token을 발급해주려면 해당 고객이 네이버 회원임을 인증해야 하고 그 인증은 로그인을 하면 된다.
로그인을 하면 네이버 서버에서는 아이디/패스워드를 확인하고 네이버 회원임을 확인하면 Access Token을 발급해준다.
해당 토큰을 우리 서비스에서 받는 방법은 Redirect를 하는 방법이다.
HTTP에는 리다이렉트 메시지가 존재한다. 서버에서 클라이언트에게 어디로 가면 될지 지정해주는게 바로 Redirect다.
로그인 후 네이버에서 다시 우리 서비스로 리바이렉트 시켜주면 사용자는 클릭 한번으로 우리 서비스로 넘어온다. 하지만 토큰은? 토큰값은 어떻게 받아오지?
간단하게도 URL에 묶어서 건네주면 된다. 그 URL은 어디있지?
우리가 리다이렉트 URL을 네이버에게 알려줘야한다. 그래야 URL에서 토큰값을 추출하는 로직을 해당 페이지에서 처리할 수 있게 구현이 가능하다.
네이버 로그인 클릭 후 URL을 살표보면 "redirect_uri" 값을 볼수있다.
그러나 어떠한 사용자가 redirect_uri를 악의적인 용도로 변경한다면? 정보를 탈취 당한다.
이러한 위험을 막기 위해 각 사이트는 Oauth를 사용하려면 우선 해당 서비스에 등록 절차가 필요하다.
우리 서비스에서 네이버 로그인 기능을 사용하려면 네이버에 등록을 하고 승인을 받아야한다.
이러한 등록 과정에서 여러 정보중에 redirect_uri도 등록을 한다. 먼저 등록을 해둬야 악의적인 사용자가
redirect_uri를 변경한다고 해도 네이버에서는 이를 수상한 행동으로 여기고 정보를 보내주지 않을 것이다.
참고
https://ko.wikipedia.org/wiki/OAuth
https://blog.naver.com/mds_datasecurity/222182943542
https://www.youtube.com/watch?v=hm2r6LtUbk8&list=PLuHgQVnccGMA4guyznDlykFJh28_R08Q-&index=2