공부한거 정리하는 노트에요

[Auth] OAuth 공부 및 궁금증 정리

by 구설구설

OAuth 인증이 끝난 뒤 다시 클라이언트의 페이지로 돌아오는 방법

인증이 완료된 후 클라이언트의 페이지로 돌아오기 위해서 리디렉션을 사용한다.

클라이언트가 OAuth 제공자에게 인증을 요청할 때 ~redirect-uri~ 파라미터를 전달하여 인증이 완료된 후 사용자를 되돌려 보낼 URL을 제공한다.

인증이 완료된 후 ~redirect-uri~로 리디렉션이 일어나면서 URL 파라미터로 인증 결과가 전달된다.

클라이언트는 URL에 포함된 인증 결과를 확인한 후 이를 백엔드 서버로 보내서 엑세스 토큰을 발급 받는다.

 

OAuth 2.0의 승인 코드(Authorization Code) 유형과 암묵적(Implicit) 유형의 차이점

두 방식의 가장 큰 차이점은 OAuth 제공자에게 발급 받는 것의 차이이다.

승인 코드 유형은 승인 코드를 발급 받지만, 암묵적 유형은 바로 엑세스 토큰을 발급 받는다.

 

구글 OAuth 예시 - 승인 코드 유형

클라이언트가 승인 코드 유형으로 구글의 OAuth 인증을 요청할 때 URL은 다음과 같다.

~response_type~을 ~code~으로 설정한 것을 확인할 수 있다.

https://accounts.google.com/o/oauth2/auth?client_id=CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=SCOPE

인증이 끝나면 구글은 ~redirect_uri~로 리디렉션 하면서 응답을 제공한다.

https://your-app.com/callback?code=AUTHORIZATION_CODE

승인 코드 유형은 리디렉션을 하면서 URL에 ~code~파라미터를 포함한다.

클라이언트는 이를 추출한 이후 서버로 전송하고 엑세스 토큰을 발급받아 사용자의 인증 상태를 관리한다.

 

구글 OAuth 예시 - 암묵적 유형

클라이언트가 암묵적 유형으로 구글의 OAuth 인증을 요청할 때 URL은 다음과 같다.

~response_type~을 ~token~으로 설정한 것을 확인할 수 있다.

https://accounts.google.com/o/oauth2/auth?client_id=CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=token&scope=SCOPE

인증이 끝나면 구글은 ~redirect_uri~ 로 리디렉션 하면서 응답을 제공한다.

https://your-app.com/callback#access_token=ACCESS_TOKEN&expires_in=3600&token_type=Bearer

승인 코드 유형과 다르게 암묵적 유형은 URL의 해시(Fragment) 부분에 액세스 토큰을 전달하고 있다.

 

응답 방식의 차이로 인한 결과

승인 코드 유형은 쿼리 파라미터, 암묵적 유형은 Fragment로 응답을 하고 있는데,

이 차이로 인해 암묵적 유형은 백엔드 서버만으로는 사용할 수 없는 문제가 있다.

백엔드 서버에서 암묵적 유형을 사용해서 OAuth를 수행한다면 응답이 Fragment로 전달되지만 Fragment는 클라이언트 측에서만 사용되고 서버로는 전달되지 않게 설계되어 브라우저가 없는 백엔드 서버에서는 Fragment를 전달 받을 방법이 없다.

Fragment가 무엇이고, 왜 서버로는 전달되지 않는지는 공식 문서에 정의되어 있다.

문서는 URI가 서버로 전달되기 전에 fragment가 분리되어 브라우저에서만 처리된다고 나와있다.

(the fragment identifier is separated from the rest of the URI prior to a dereference, and thus the identifying information within the fragment itself is dereferenced solely by the user agent, regardless of the URI scheme.)

 

redirect_url이 아닌 redirect_uri인 이유

우선 URL과 URI에 대해서 알아야 한다.

OAuth 2.0 프로토콜은 특정한 프로토콜이나 스키마에 종속되지 않고 다른 메커니즘을 통해서 인증을 처리할 수 있는 여지를 남겨두기 위해서 URL과 같은 정해진 형식이 아니라 URI를 사용하였다.

그러나 ~redirect_uri~는 대부분 URL을 사용한다.

블로그의 정보

공부중임

구설구설

활동하기