Ezcho

[OAuth 2.0] OAuth2.0 프로토콜 동작과정 본문

BE/API

[OAuth 2.0] OAuth2.0 프로토콜 동작과정

Ezcho 2024. 1. 2. 19:07

OAuth2.0, Open Authorization 2.0은 인증을 위한 개방형 표준 프로토콜 이다.

 

흔히들 소셜로그인이라 부르는 카카오톡로그인, Google로그인, 네이버로그인등 타서비스의 계정을 사용해 내가 개발한 서비스의 회원으로 등록하는것도, 더 나아가 내가 만든 서비스에서 해당 서비스의 특정 정보를 가져오기 위해서는 소셜로그인이 필요합니다.

 

예를들어 구글에 로그인 한 후 내 캘린더 정보를 가져온다고 생각해보자.

 

1차원적 관점으로 바라볼때  데이터를 가져오기위해서는 구글의 아이디와 비밀번호를 내가 만든 서비스에 사용자가 입력하게 한 후 서버에서 구글에 접근한 후 유저에게 전달받은 ID와 PWD를 통해 로그인을 하면 된다.

 

하지만.. 이 방법이 맞는것일까? 당연히틀렸다. 사용자가 내 서비스에 ID 와 PWD를 제공한다는것 부터 보안관련 이슈에 굉장히 취약해진다는 문제가 있다. 셀수없는 이유가 있다. 잘 생각해보자

 

OAuth란?

웹 과 모바일 앱과같은 클라이언트 애플리케이션이 사용자의 데이터 및 리소스에 대한 접근권한을 안전하게 위임하고 관리하기 위한 인증및 권한 프로토콜 이다. 말로만 이야기하면 어려우니, 동작방식을 보고 이해해보자.

1. 사용자인증: OAuth프로토콜을 사용해 내 서비스는 사용자의 ID및 PWD를 요청하지 않고도 사용자를 인증할 수 있습니다. 하지만 제3자 인증 공급자(Google, Facebook등)로 리디렉션되어 해당 공급자의 로그인 시스템을 통해 인증합니다.

2. 권한 부여: OAuth를 사용하여 사용자는 특정 데이터또는 서비스에 액세스 할 수 있는 권한을 부여할 수 있습니다.

3. 보안: 보안을 강화하기위해 AccessToken등을 사용하여 클라이언트 애플리케이션이 권한을 사용하는동안 보안을 제공합니다.

 

REST API 에서의 OAuth2.0의 동작방식

OAuth2.0은 현재 가장 널리 사용되는 버젼이며, 다양한 웹서비스와 API에서 인증및 권한부여에 사용됩니다.

그러면 어떻게 동작하는지 그림으로 이해해보자. 우린 이걸 REST API로 개발할것이다.

https://blog.naver.com/mds_datasecurity/222182943542

그림을 이해하기 전에 몇가지 용어에 대해 알아보자

1. User(Resource Onwer): 리소스 소유자, 사용자, 유저 등 다양하게 불리며 보호된 자원에 접근할 수 있는 자격을 부여해 주는 주체

2. Client(Application): 보호된 자원을 사용하려고 접근 요청을 하는 애플리케이션

3. Authorization Server(Auth Server): 권한서버, 인증/인가 를 수행하는 서버로 클라이언트의 접근 자격을 확인하고 토큰발급. 부여

4. Resource Server: 사용자의 보호된 자원을 호스팅하는 서버

5. AccessToken: 리소스서버에게서 리소스 소유자의 보호된 자원을 획득할 때 사용되는 만료 기간이 있는 토큰(열쇠) 입니다.

6. RefreshToken: AccessToken만료시 이를 갱신하기 위한 용도로 사용되는 토큰입니다. AccessToken보다 만료기간이 깁니다.

 

동작과정

1. 먼저 유저(리소스 오너)는 Client에 특정 서비스가 제공하는 정보, (제한된 정보)를 사용하기 위해 서버에 알린다.

2. 서버는 Auth Server로 Request를 통해 해당 서비스내의 정보를 사용할것을 요청한다.

이 과정에서 일반적으로 client_id, redirect_url, response_type 등의 파라미터가 포함된다.

일반적으로 개발단계에서 해당 서비스(구글, 페이스북, ...)에 우리 앱을 등록함으로써 해당 정보들을 받게 된다.

3. Auth서버에서 우선적으로 로그인페이지를 리디렉트 한다. 이후 Auth서버에서 리디렉트된 로그인페이지에서 사용자는 ID와 PWD를 입력하고 로그인을 한다.

4. 이러면 Auth서버에서 Authorization code를 response 한다. 위 그림에서는 권한 부여 승인 코드 라고 되어있다.

5. 사용자는 해당 코드를 가지고 AccessToken을 다시 요청한다. 이과정에서 header에 AuthCode를 포함한다.

6. Auth서버에서는 해당 Auth코드와 기타 파라미터가 유효한지 확인하고 AccessToken을 전달한다. 

7. 이제 우리는 발급된 AccessToken을 Request 헤더에 포함시켜 리소스 서버에 특정 정보(자원)를 요청할 수 있다.

 

 

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

 

카카오 Developers 페이지에 관련 이미지로 잘 정리되어있어서 가져왔다. 위 그림을 보고 이해해보자

리소스 서버는 제외한 그림이다(accessToken, refreshToken 발급까지만 보여준다)

1. 먼저 클라이언트는 서버에게 카카오로 로그인할것이라는 요청을 한다.

2. https://kauth.kakao.com/oauth/authorize 라는 url/path와 몇개의 파라미터를 포함한 GET요청을 보낸다.(자세한 내용은 아래)

3. 카카오 계정 로그인 페이지로 리디렉트된다.

4. 사용자는 로그인을 완료한다

5. 서버에 위임되는 정보리스트에 대한 동의목록을 확인하고 동의한다.

6. Redirect URI로 Authorization Code를 서버에 전달한다.(302)

7. 이후 사용자는 https://kauth.kakao.com/oauth/token 으로 POST요청을 보낸다.

8. Auth서버에서는 Auth code가 유효한지 확인하고 AccessToken과 RefreshToken을 발급해준다.

9. 이후 토큰을포함한 여러 Request를 통해 ResourceServer의 여러 정보에 접근할 수 있다.

Comments