외부 서비스에 대한 접근 권한 획득, Oauth 2.0

스팸·2023년 6월 27일
0

요새 구글, 페이스북, 카카오톡 등 외부 서비스를 이용하여 로그인 하는 사이트가 많이 보이는데, 이 때 사용되는 기술이 바로 Oauth 2.0이다.

1. 개요

사용자의 구글, 페이스북, 카카오톡 정보를 일부 위임 받아 내가 만든 서비스에서 사용한다고 생각해보자.
이 떄, 외부 서비스에 대한 접근 권한을 어떻게 위임받을 수 있을까?

가장 쉬운 방법은 사용자에게 해당 서비스의 아이디/비밀번호를 직접적으로 물어보는 것이겠지만,
이는 사용자에게도 외부 서비스를 제공해야 하는 시스템에 입장에서도 보안 상 큰 위험이 된다.

이를 해결하고자 나온 개념이 바로 Oauth 2.0 프로토콜이다. Oauth 2.0은 외부 서비스로부터 엑세스 토큰이라는 임시 로그인 권한을 발급받아 해당 서비스에 대한 접근 권한을 위임 받는다.

2. 개념

Oauth 2.0 방식을 이해하기 앞서, 알아야 하는 용어가 있다.

리소스 오너 (Resource Owner)

위에서 말한 사용자를 의미한다. 구글, 페이스북, 카카오톡 등 외부 서비스(리소스)의 사용의 주체를 의미한다.

리소스 서버 (Resource Server)

구글, 페이스북, 카카오톡 등의 리소스를 제공하는 주체를 의미한다. 리소스 오너를 인증하고 엑세스 토큰을 발급하고 관리한다.

클라이언트 (Client)

리소스 서버의 자원을 이용하고자 하는 서비스를 의미한다. 일반적으로 우리가 개발하는 서비스가 된다.

3. 사용하기

애플리케이션 등록

리소스 서버에 애플리케이션을 등록한다.

등록할 때는 redirect uri를 입력 받게 되어 있는데 이는 우리가 리소스 오너에게서 권한을 위임 받았을 때, 엑세스 토큰 발급에 필요한 정보를 받기 위해 리소스 서버에서 호출할 클라이언트의 주소를 의미한다.

redirect uri는 기본적으로 보안을 위해 https만 허용된다. 단, 루프백(localhost)은 예외적으로 http가 허용된다.

로그인 요청 정보 작성

리소스 오너에게 권한을 위임받기 위해서, 클라이언트는 아래 정보를 포함한 로그인 url을 리소스 서버에 전달한다.

response_type, client_id, redirect_uri

이 때, response_type은 code로 지정을 해야 엑세스 발급에 필요한 authorization code를 발급 받을 수 있다.

로그인 요청 및 성공

2번의 내용을 토대로 리소스 오너가 로그인을 시도하고 성공까지 하게 되면 리소스 서버에서는 authorization code를 발급하고, 애플리케이션을 등록할 떄 작성했던 클라이언트의 redirect uri 주소로 해당 코드 정보를 전송한다.

엑세스 토큰 발급

redirect uri 로직에서는 3번에서 발급 받은 authorization code와 아래 정보를 포함하여 엑세스 토큰 발급 요청을 보낸다.

client_id, client_secret, grant_type, code(authorization code), redirect_uri

이 때, client_secret은 외부로 절대 발설되어서는 안되는 키 값이다. 또한 grant_type은 authorization_code로 지정한다.

(추가) 리프레시 토큰 발급

액세스 토큰만으로 리소스 서버에 필요한 자원을 요청할 수 있지만, 문제는 토큰 만료 기간이다. 만료 기간을 무제한으로 하자니, 해당 토큰이 외부 해커에 의해 탈취되었을 때 문제가 발생하고, 그렇다고 짧게 하자니, 사용자가 로그인 해야 하는 빈도가 잦아진다. 이에 사용되는 개념이 리프레시 토큰이다. 액세스 토큰이 만료 되었을 때, 리프레시 토큰을 이용하여 엑세스 토큰을 재발급 받는다.

일반적으로 엑세스 토큰 기간을 짧게(1시간), 리프레시 토큰 기간(2주)을 길게 설정한다.
아래 정보를 포함하여 리프레시 토큰을 발급한다.

client_id, refresh_token, grant_type

이 때, grant_type의 값은 refresh_token으로 명시한다. 또한, 리프레시 토큰 발급은 액세스 토큰을 발급할 때 응답 받았던 만료 기간(expires_in)을 이용하여 발급한다.

4. 마치며

개발하면서 의외로 많이 접하게 되는 중요한 기술인데도 매일 사용하지는 않다보니 자꾸 개념을 잊어버린다. 이번에는 꼭 기억하기를 바라면서.

0개의 댓글