CS

OAuth 개념 및 동작 방식

🤖 Play with Android 🤖 2021. 10. 27. 21:03
728x90

 

 

 

우리는 자주 어느 사이트에 로그인을 하려고 하면 외부 소셜 계정을 기반으로 간편히 로그인할 수 있는 웹 애플리케이션을 쉽게 찾아볼 수 있다. 예를 들어, 외부 웹 애플리케이션에 카카오로 로그인하면 API를 통해 연동된 카카오 로그인 이메일 정보를 가져와 웹 애플리케이션의 아이디로써 활용할 수 있다.

이때 사용되는 프로토콜이 OAuth이다. 

 

 

 

 

📌  OAuth란?

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로써 사용되는, 접근 위임을 위한 개방형 표준이다.

 

 

 

 

🤷‍♂️  OAuth는 왜 사용할까?

OAuth를 사용하는 이유는 다른 서비스의 회원 정보를 안전하게 사용하기 위해서이다. 여기에서 안전하게의 주체는, 회원 정보를 가지고 있는 주체, 우리의 고객이다. 즉, 우리의 고객이 안전하게 다른 서비스의 정보를 우리 서비스에 건네주기 위한 방법이다.

 

고객이 자신의 카카오 아이디/비밀번호를 우리 서비스에 알려주지 않아도, 카카오에 있는 고객의 정보를 우리 서비스에서 안전하게 사용하기 위한 방법이라고 할 수 있다.

 

 

 

 

 

📌  OAuth 용어 정리

  • Resource owner(자원 소유자)
    → Resource server(카카오, 네이버 등)의 계정을 소유하고 있는 사용자
  • Client
    → 카카오, 네이버 등의 API 서비스를 이용하는 제 3의 서비스
  • Authorization Server(권한 서버)
    → 권한을 관리해주는 서버, Access Token, Refresh Token 등을 발급, 재발급해주는 역할
  • Resource Server
    → OAuth2 서비스를 제공하고, 자원을 관리하는 서버
  • Access Token
    → Authorization Server로부터 발급받은 인증 토큰, Resource Server에 전달하여 서비스 제공받을 수 있다.

 

OAuth 흐름도

 

 

 

 

 

 

📌  Access Token

OAuth를 통한 소셜로그인은 소셜 로그인 계정의 사용자 자격정보로 인가 코드를 받아오고, 인가 코드로 액세스 토큰과 리프레시 토큰을 얻는 과정으로 구성돼 있다.

액세스 토큰은 사용자를 인증하고 소셜 로그인 API 호출 권한을 부여하게 된다.

리프레시 토큰(Refresh Token)은 사용자가 매번 소셜 계정 정보를 입력하거나 소셜 계정으로 로그인하지 않고도 액세스 토큰을 발급받을 수 있게 한다.

 

 

카카오를 예로 들어보겠다.

특정 고객이 본인의 카카오 아이디와 비밀번호로 자신이 정상적인 카카오 회원임을 인증하면 우리는 카카오에서 건내주는 access Token을 가져오게 된다. 카카오로 로그인하기 버튼을 누르면 카카오 아이디 비밀번호를 치는 페이지로 이동하는 것이 바로 이 이유이다.

 

 

고객이 카카오에 로그인을 하면 카카오에서는 자체적으로 서버에서 아이디 비밀번호를 확인하고 해당 고객이 정상적인 카카오 회원임을 확인하고 이 고객과 관련된 access Token을 발급하게 된다.

 

 

 

 

시간이 지나서 Access Token이 만료된다면 Refresh Token을 통해 새로 발급받을 수 있다.

Access Token을 발급받을 때 expires_in 이라는 항목으로 유효시간이 같이 넘어오는데,

이를 통해 유효시간이 지났는지 확인할 수 있고 지났으면 Refresh Token으로 재발급받는다.

 

물론 Refresh Token도 만료기간이 존재하지만 위에서 보는 것처럼 Refresh Token의 유효기간은 access Token의 유효기간보다 훨씬 큰 것을 볼 수 있다.

 

 

 

 

 

 

 

📌  Redirect

우리는 Acess Token을 받은 방법으로 Redirect를 이용한다.

HTTP에는 리다이렉트 메시지가 존재하는데 쉽게 말해서 서버에서 클라이언트에게 가야 할 위치를 지정해 주는 것이 Redirect이다.

 

출처 : https://velog.io/@undefcat/OAuth-2.0-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC

 

 

Redirect를 이용하면, 고객은 브라우저가 안내해주는 페이지로 이동하게 된다.

고객이 소셜로그인을 하고, 카카오에서 다시 우리 서비스로 Redirect 시켜주면 고객은 쉽게 다시 우리 사이트로 넘어올 수 있게 된다.

이때 토큰 값은 query string을 통해서 URI에 묶여서 오게 된다. 

 

 

 

이 때 Redirect 되는 URI은 우리가 카카오와 합의된 URI로 지정해주어야 한다.

 

그렇지 않다면 만약 악의를 품은 공격자가 Redirect 되는 URL을 본인이 원하는 사이트로 바꾸고 내 Aceess Token을 받는 위험한 상황이 올 수도 있다. 

 

이를 방지하기 위해 서버와 카카오는 사전에 등록을 하고 승인 받은 Redirect URI로만 access Token을 보내주게 된다.

만약 승인된 URI이 아닌 다른 URI로 Redirect 요청이 온다면 카카오에서 이를 알고 Acess Token을 보내주지 않는다.

 

 

실제로 필자의 토이프로젝트에 등록된 카카오 로그인 Redirect URI

 

 

 

 

 

 

📃  정보 받기

Acess Token 받기를 완료했다면 이제 이 토큰을 가지고 카카오에 저장되어 있는 고객의 정보를 가져와야 한다.

카카오에는 우리가 Acess Token을 건네주면 이 토큰이 정상적인 토큰인지 확인하고 정보를 건네주는 페이지가 있다.

 

 

 

 

 

이렇게 헤더에 Acess Token을 넣어 전달하게 되면 카카오는 고객 정보를 우리에게 전달해주게 된다.

 

 

 

 

카카오에 저장된 고객 정보에는 다음과 같은 정보들이 있는데 처음 고객이 소셜 로그인을 통해 우리의 웹 애플리케이션에 로그인하는 페이지에서 동의한 항목만을 가져올 수 있다.

 

 

 

 

 

 

 

📖   정리

OAuth는 크게 3단계로 나뉘어 있음을 알 수 있다.

  1. 서비스를 등록하는 과정
    • 원하는 소셜로그인 회사에 본인 웹 애플리케이션 등록하기
    • 이 과정에서 redirect_uri 등을 합의하기
  2. 토큰을 받기 위한 과정
    • 사용자를 소셜로그인 페이지로 이동시키기
    • 소셜로그인 회사가 사용자를 우리 서비스로 Redirect 시키기
  3. 토큰을 이용해 정보를 요청하는 과정

 

이번 글은 모든 예시를 카카오로 들었지만 OAuth는 위에서 말 한것 처럼 개방 표준 프로토콜이기 때문에 소셜 로그인을 지원하는 대부분의 회사들은 이 표준에 맞춰 놓았기 때문에 같은 방식으로 구현하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference:

https://stormpath.com/blog/what-the-heck-is-oauth

https://showerbugs.github.io/2017-11-16/OAuth-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

https://velog.io/@undefcat/OAuth-2.0-%EA% B0%84% EB% 8B% A8% EC% A0%95% EB% A6% AC

https://sunow.tistory.com/entry/OAuth2%EB%9E%80

https://tecoble.techcourse.co.kr/post/2021-07-10-understanding-oauth/

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api