OAuth 2.0 인증

hwhyeons·2023년 12월 1일
0

개발 중인 프로젝트에서 사용자 정보를 보관하기 위해 로그인 과정을 구현하다가

OAuth를 이용한 구글 로그인 방식을 구현하게 되었다.

요즘은 뭘 해도 인터넷을 쓰기 때문에 사이트에 가입할 일이 정말 많은데

사이트마다 비밀번호 규칙도 다르고 일일이 사이트마다 저장해놓기도 쉽지 않다.

그래서 그런지 소셜 로그인 기능을 지원하는 사이트 들은 회원가입도 쉽고

비번을 따로 기억하거나 저장할 필요가 없어서 편리하다.


이런 로그인 방식에서 많이 사용되는 인증 방식이 OAuth2.0인데

이를 알아보자



OAuth 2.0

OAuth 2.0은 사용자의 자격 증명을 직접 공유하지 않고
서드파티 프로그램에 사용자의 데이터나 자원에 접근할 수 있도록 하는 인가 프레임워크다.

간단하게 요약하면, 회원가입 / 로그인 기능을 사용할 때, 우리가 관리하지 않고

구글, 네이버, 카카오 등에 위임해서 관리하는 방식이다.

웹사이트에서 이런 구글, 네이버 등으로 회원가입을 할 때, 어떤 사이트는

내 프로필 이미지나 나이 성별 등도 요구하고 어떤 사이트는 이메일만 요구하고

이렇게 요구 범위가 다른 것도 볼 수 있었는데, 이 또한 OAuth 2.0에서

필요한 권한을 설정할 수 있다.


OAuth 2.0에 사용하는 여러가지 프로토콜이 있지만

권한 부여 승인코드를 이용하는 방식을 알아보겠다.




동작 과정

구글 문서에서 제공하는 사진에는


이와 같이 작동 과정이 나와 있다.

Resource Owner : 최종 사용자. 리소스에 대한 엑세스 권한을 부여할 수 있는 주체

Authorization Server : OAuth 2.0 사양을 준수하며 Grant 및 Access Token
발급 담당

Resource Server : Google, Kakao, Facebook 등 토큰 검증시에 API요청을
처리하는 서버

Client : 애플리케이션 서비스. 앱은 리소스 소유자를 대신하여 리소스 서버에 요청을 보낸다. (이를 위해 리소스 소유자는 액세스 권한을 애플리케이션에 부여해야 한다)



예를 들어 어떤 사이트에서 구글 로그인 기능으로 회원 가입을 한다고 가정해보자.
  1. 구글로 로그인과 같은 버튼을 본 적이 다들 있을 것이다.
    이런 버튼을 클릭하면, 구글 로그인 페이지 URL을 받아서 (client_id와 함께)
    익숙한 로그인 페이지로 이동한다

  2. 로그인하면서 필요한 권한들을 제공할건지 허용한다

  3. Authorization Code를 발급
    -> 참고로 암묵적 승인 방식을 사용하는 경우 이 코드를 발급하지 않고 바로
    Access Token을 발급 받는 방식도 있다.

  4. Authorization Code로 클라이언트가 access_token을 인증 서버에 요청

  5. 인증서버가 access_token 발급

  6. 클라이언트가 Resource Server에 데이터를 요청할 때 이 Access Token을 첨부하여
    인증

이 과정이 기본적인 OAuth 2.0 인증 과정이다.



나는 프로젝트에 구글 로그인 과정을 구현하면서, Resource 정보에 포함된

이메일 주소가 프로젝트 DB에 존재하면 회원가입을 하지 않고 토큰만 발급하고

만약 없다면 내부 DB에 회원을 만들고 access_token을 발급하는 방식을 적용했다.


추가로, 위 동작 과정에는 안나와 있지만,

access token이 만료 되면 refresh token을 이용해 다시 access token을

재발급 하는 과정을 추가하였다.




마치며

대학교 2학년 때 처음 보안 수업을 듣게 되었는데,

웹에 대한 개념은 거의 아무것도 몰랐었고, 토큰을 이용한 인증방식이나

OAuth등등에 대한 개념도 전혀 모르는 상태에서 해시 함수에 대한 개념을 배웠을 때,

앞으로 프로젝트로 로그인이나 회원 기능을 구현하고 싶으면

단순히

"데이터베이스에 비밀번호는 해싱해서 넣고 이 유저가 보낸 비밀번호 해시값과

DB에 저장된 해시값을 비교하면 되겠구나"

라고만 생각했었다.

그렇게 생각하면서도 만약에 중간에 탈취당하면 어떡하지 등등의 생각도 했었던 것 같다.

하지만 웹 통신 보안 기술들을 배우면서 생각보다 정말 복잡하다는 것을 알게 되고

이러한 보안 기술들 덕분에 보안에 대해 아주 세세하게 모든 경우를 다 따지지 않아도

안전하게 요청하고 정보 들을 받아올 수 있다는 것을 알게 되었다.

0개의 댓글