OAuth 원리와 이해 (feat. 카카오 로그인)
OAuth는 무엇인가요?
티스토리 로그인페이지에서 보면 카카오톡으로 로그인이라는 버튼이 보일 것입니다. 이 외에도 구글, 네이버, 페이스북으로 로그인 할 수 있도록 타 사이트에서 기능을 제공해주고 있는데 이처럼 서비스에 직접 사용자를 등록하지 않고 제 3자의 플랫폼에 사용자의 접근 권한을 위임할 수 있도록 해주는 표준 프로토콜을 OAuth라고 합니다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준. - 위키피디아
OAuth가 사용되기 전에는 인증방식의 표준이 없었기 때문에 기존의 기본인증인 아이디와 비밀번호를 사용하였는데, 이는 보안상 취약한 구조일 가능성이 매우 많다.
OAuth는 왜 사용하는 것인가요?
일반적인 웹사이트에 개인 정보를 준다는 것은 꽤 위험한 일입니다.
모두투어, 홈페이지서 고객 개인정보 유출… "깊은 사과"
[단독] '中에 개인정보 유출' 카카오페이, 경찰 조사 받는다
최근 뉴스에서도 홈페이지에서 고객 개인정보가 유출된 사례 뿐만 아니라 카카오페이에서는 최근 중국 알리페이에 개인정보를 유출한 혐의로 조사를 받는 등 해당 사건을 보면 사용자는 개인정보를 어디에서 사용하는지 알 수 없는 사이트들이 많습니다. 이 경우 웹사이트를 사용하는 사용자들도 신뢰하지 못할 뿐더러 사이트를 운영하는 사용자도 부담이 큽니다..
이러한 문제를 해결하기 위해 탄생한 것이 OAuth 입니다.
개인정보는 정말 안전한 곳에 맡기고 해당 기업에서 정보를 확인하고 접근할 수 있는 토큰만 발급해 주는 것입니다
이를 통해 운영자 또한 부담이 줄며 사용자는 안전함과 동시에 편리함까지 갖출 수 있게 되었습니다.
OAuth의 구성 요소
OAuth의 구성 요소는 크게 4가지로 이루어집니다.
- Client
클라이언트는 현재 Third-Party Application을 사용하기 위한 Application을 의미합니다.
- Resource Owner
리소스의 소유자 또는 사용자를 뜻합니다. Third-Party Application의 보호된 자원에 접근할 수 있는 자격을 부여해 주는 주체이며 OAuth2 프로토콜 흐름에서는 클라이언트를 인증(Authorize)하는 역할을 수행합니다. 인증이 완료되면 권한 획득 자격을 Client에게 부여합니다.
- Authorization Server & Resource Server
Authorization Server는 단어 뜻 그대로 권한을 가진 서버로 Resource Owner를 인증하며, Client의 접근 자격을 확인하고 Access Token을 발급해 주는 역할을 합니다. Resource Server는 google, kakao, naver 등, 사용자의 보호된 자원*(리소스)*을 가지고 있는 서버를 말합니다.
Authorization Server와 Resource Server는 별개로 구분되어 있지만, 구성에 따라 아키텍처가 달라질 수도 있습니다.
Authorization Server와 Resource Server가 동일한 서버일 수도 있고, 별개의 서버일 수도 있으며, 하나의 Authorization Server가 여러 개의 Resource Server에 액세스 토큰을 발급할 수도 있습니다.
OAuth의 동작 과정
OAuth의 인증 과정은 크게 4단계로 이루어집니다.
첫째, 애플리케이션이 사용자에게 인증 요청
둘째, 사용자가 이 요청을 승인한 경우, 애플리케이션은 인증 서버에 코드를 요청
셋째, 애플리케이션은 이 코드를 사용하여 인증 서버로부터 액세스 토큰을 받음
넷째, 애플리케이션은 이 토큰을 사용하여 리소스 서버에 접근
KaKao로그인으로 알아보는 OAuth 동작 과정
Application의 사용자가 카카오톡 로그인 요청하면 Application에서는 URL을 생성하여 호출하게 됩니다
<https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}>
- 쿼리 파라미터
이름 타입 설명
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드를 전달받을 서비스 서버의 URI |
response_type | String | code로 고정 |
해당 쿼리파라미터의 경우 Third-Party Application마다 설정이 다르며 각각의 필수값들이 다를 수도 있습니다
사용자 동의 단계에서 사용자 선택에 따라 오는 응답 값이 또 다를 수 있습니다.
사용자 동의 단계에서 취소 버튼을 클릭하였을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?error=access_denied&error_description=User%20denied%20access
[동의하고 계속하기] 선택 했을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}
사용자가 [동의하고 계속하기]를 선택했을 경우에 로그인이 진행되며 이때 오는 redirect_uri가 authorize_code를 이용해 token발급 요청을 보낼 수 있습니다.
redirect URI로 받은 인가코드를 가지고 token발급 요청을 보냅니다
메서드 URL
POST | https://kauth.kakao.com/oauth/token |
이름 타입 설명
grant_type | String | authorization_code로 고정 |
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드가 리다이렉트된 URI |
code | String | 인가 코드 받기 요청으로 얻은 인가 코드 |
예제
curl -v -X POST "<https://kauth.kakao.com/oauth/token>" \\
-H "Content-Type: application/x-www-form-urlencoded" \\
-d "grant_type=authorization_code" \\
-d "client_id=${REST_API_KEY}" \\
--data-urlencode "redirect_uri=${REDIRECT_URI}" \\
-d "code=${AUTHORIZE_CODE}"
- 응답
이름 타입 설명
token_type | String | 토큰 타입, bearer로 고정 |
access_token | String | 사용자 액세스 토큰 값 |
expires_in | Integer | 액세스 토큰과 ID 토큰의 만료 시간(초) |
refresh_token | String | 사용자 리프레시 토큰 값 |
refresh_token_expires_in | Integer | 리프레시 토큰 만료 시간(초) |
access_token의 경우 클라이언트가 리소스 서버의 리소스에 접근하기 위한 권한을 부여받는 토큰입니다. 액세스 토큰은 권한 서버로부터 발급되며, 일반적으로 제한된 유효 기간을 가지고 있습니다.
refresh_token의 경우 액세스 토큰의 유효 기간이 만료된 후 새로운 액세스 토큰을 받기 위한 토큰입니다. 이를 통해 사용자는 다시 로그인할 필요 없이 토큰 유효 시간 갱신만으로 계속 애플리케이션을 사용할 수 있습니다.
참고
- kakao Developers
OAuth는 무엇인가요?
!https://blog.kakaocdn.net/dn/dRa5AS/btsJnfTIrpn/SqkQT2dNgUyTYjHUshUfKk/img.png
티스토리 로그인페이지에서 보면 카카오톡으로 로그인이라는 버튼이 보일 것입니다. 이 외에도 구글, 네이버, 페이스북으로 로그인 할 수 있도록 타 사이트에서 기능을 제공해주고 있는데 이처럼 서비스에 직접 사용자를 등록하지 않고 제 3자의 플랫폼에 사용자의 접근 권한을 위임할 수 있도록 해주는 표준 프로토콜을 OAuth라고 합니다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준. - 위키피디아
OAuth가 사용되기 전에는 인증방식의 표준이 없었기 때문에 기존의 기본인증인 아이디와 비밀번호를 사용하였는데, 이는 보안상 취약한 구조일 가능성이 매우 많다.
OAuth는 왜 사용하는 것인가요?
일반적인 웹사이트에 개인 정보를 준다는 것은 꽤 위험한 일입니다.
모두투어, 홈페이지서 고객 개인정보 유출… "깊은 사과"
[단독] '中에 개인정보 유출' 카카오페이, 경찰 조사 받는다
최근 뉴스에서도 홈페이지에서 고객 개인정보가 유출된 사례 뿐만 아니라 카카오페이에서는 최근 중국 알리페이에 개인정보를 유출한 혐의로 조사를 받는 등 해당 사건을 보면 사용자는 개인정보를 어디에서 사용하는지 알 수 없는 사이트들이 많습니다. 이 경우 웹사이트를 사용하는 사용자들도 신뢰하지 못할 뿐더러 사이트를 운영하는 사용자도 부담이 큽니다..
이러한 문제를 해결하기 위해 탄생한 것이 OAuth 입니다.
개인정보는 정말 안전한 곳에 맡기고 해당 기업에서 정보를 확인하고 접근할 수 있는 토큰만 발급해 주는 것입니다
이를 통해 운영자 또한 부담이 줄며 사용자는 안전함과 동시에 편리함까지 갖출 수 있게 되었습니다.
OAuth의 구성 요소
OAuth의 구성 요소는 크게 4가지로 이루어집니다.
- Client
클라이언트는 현재 Third-Party Application을 사용하기 위한 Application을 의미합니다.
- Resource Owner
리소스의 소유자 또는 사용자를 뜻합니다. Third-Party Application의 보호된 자원에 접근할 수 있는 자격을 부여해 주는 주체이며 OAuth2 프로토콜 흐름에서는 클라이언트를 인증(Authorize)하는 역할을 수행합니다. 인증이 완료되면 권한 획득 자격을 Client에게 부여합니다.
- Authorization Server & Resource Server
Authorization Server는 단어 뜻 그대로 권한을 가진 서버로 Resource Owner를 인증하며, Client의 접근 자격을 확인하고 Access Token을 발급해 주는 역할을 합니다. Resource Server는 google, kakao, naver 등, 사용자의 보호된 자원*(리소스)*을 가지고 있는 서버를 말합니다.
Authorization Server와 Resource Server는 별개로 구분되어 있지만, 구성에 따라 아키텍처가 달라질 수도 있습니다.
Authorization Server와 Resource Server가 동일한 서버일 수도 있고, 별개의 서버일 수도 있으며, 하나의 Authorization Server가 여러 개의 Resource Server에 액세스 토큰을 발급할 수도 있습니다.
OAuth의 동작 과정
OAuth의 인증 과정은 크게 4단계로 이루어집니다.
첫째, 애플리케이션이 사용자에게 인증 요청
둘째, 사용자가 이 요청을 승인한 경우, 애플리케이션은 인증 서버에 코드를 요청
셋째, 애플리케이션은 이 코드를 사용하여 인증 서버로부터 액세스 토큰을 받음
넷째, 애플리케이션은 이 토큰을 사용하여 리소스 서버에 접근
KaKao로그인으로 알아보는 OAuth 동작 과정
Application의 사용자가 카카오톡 로그인 요청하면 Application에서는 URL을 생성하여 호출하게 됩니다
<https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}>
- 쿼리 파라미터
이름 타입 설명
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드를 전달받을 서비스 서버의 URI |
response_type | String | code로 고정 |
해당 쿼리파라미터의 경우 Third-Party Application마다 설정이 다르며 각각의 필수값들이 다를 수도 있습니다
사용자 동의 단계에서 사용자 선택에 따라 오는 응답 값이 또 다를 수 있습니다.
사용자 동의 단계에서 취소 버튼을 클릭하였을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?error=access_denied&error_description=User%20denied%20access
[동의하고 계속하기] 선택 했을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}
사용자가 [동의하고 계속하기]를 선택했을 경우에 로그인이 진행되며 이때 오는 redirect_uri가 authorize_code를 이용해 token발급 요청을 보낼 수 있습니다.
redirect URI로 받은 인가코드를 가지고 token발급 요청을 보냅니다
메서드 URL
POST | https://kauth.kakao.com/oauth/token |
이름 타입 설명
grant_type | String | authorization_code로 고정 |
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드가 리다이렉트된 URI |
code | String | 인가 코드 받기 요청으로 얻은 인가 코드 |
예제
curl -v -X POST "<https://kauth.kakao.com/oauth/token>" \\
-H "Content-Type: application/x-www-form-urlencoded" \\
-d "grant_type=authorization_code" \\
-d "client_id=${REST_API_KEY}" \\
--data-urlencode "redirect_uri=${REDIRECT_URI}" \\
-d "code=${AUTHORIZE_CODE}"
- 응답
이름 타입 설명
token_type | String | 토큰 타입, bearer로 고정 |
access_token | String | 사용자 액세스 토큰 값 |
expires_in | Integer | 액세스 토큰과 ID 토큰의 만료 시간(초) |
refresh_token | String | 사용자 리프레시 토큰 값 |
refresh_token_expires_in | Integer | 리프레시 토큰 만료 시간(초) |
access_token의 경우 클라이언트가 리소스 서버의 리소스에 접근하기 위한 권한을 부여받는 토큰입니다. 액세스 토큰은 권한 서버로부터 발급되며, 일반적으로 제한된 유효 기간을 가지고 있습니다.
refresh_token의 경우 액세스 토큰의 유효 기간이 만료된 후 새로운 액세스 토큰을 받기 위한 토큰입니다. 이를 통해 사용자는 다시 로그인할 필요 없이 토큰 유효 시간 갱신만으로 계속 애플리케이션을 사용할 수 있습니다.
참고
- kakao Developers
OAuth는 무엇인가요?
!https://blog.kakaocdn.net/dn/dRa5AS/btsJnfTIrpn/SqkQT2dNgUyTYjHUshUfKk/img.png
티스토리 로그인페이지에서 보면 카카오톡으로 로그인이라는 버튼이 보일 것입니다. 이 외에도 구글, 네이버, 페이스북으로 로그인 할 수 있도록 타 사이트에서 기능을 제공해주고 있는데 이처럼 서비스에 직접 사용자를 등록하지 않고 제 3자의 플랫폼에 사용자의 접근 권한을 위임할 수 있도록 해주는 표준 프로토콜을 OAuth라고 합니다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준. - 위키피디아
OAuth가 사용되기 전에는 인증방식의 표준이 없었기 때문에 기존의 기본인증인 아이디와 비밀번호를 사용하였는데, 이는 보안상 취약한 구조일 가능성이 매우 많다.
OAuth는 왜 사용하는 것인가요?
일반적인 웹사이트에 개인 정보를 준다는 것은 꽤 위험한 일입니다.
모두투어, 홈페이지서 고객 개인정보 유출… "깊은 사과"
[단독] '中에 개인정보 유출' 카카오페이, 경찰 조사 받는다
최근 뉴스에서도 홈페이지에서 고객 개인정보가 유출된 사례 뿐만 아니라 카카오페이에서는 최근 중국 알리페이에 개인정보를 유출한 혐의로 조사를 받는 등 해당 사건을 보면 사용자는 개인정보를 어디에서 사용하는지 알 수 없는 사이트들이 많습니다. 이 경우 웹사이트를 사용하는 사용자들도 신뢰하지 못할 뿐더러 사이트를 운영하는 사용자도 부담이 큽니다..
이러한 문제를 해결하기 위해 탄생한 것이 OAuth 입니다.
개인정보는 정말 안전한 곳에 맡기고 해당 기업에서 정보를 확인하고 접근할 수 있는 토큰만 발급해 주는 것입니다
이를 통해 운영자 또한 부담이 줄며 사용자는 안전함과 동시에 편리함까지 갖출 수 있게 되었습니다.
OAuth의 구성 요소
OAuth의 구성 요소는 크게 4가지로 이루어집니다.
- Client
클라이언트는 현재 Third-Party Application을 사용하기 위한 Application을 의미합니다.
- Resource Owner
리소스의 소유자 또는 사용자를 뜻합니다. Third-Party Application의 보호된 자원에 접근할 수 있는 자격을 부여해 주는 주체이며 OAuth2 프로토콜 흐름에서는 클라이언트를 인증(Authorize)하는 역할을 수행합니다. 인증이 완료되면 권한 획득 자격을 Client에게 부여합니다.
- Authorization Server & Resource Server
Authorization Server는 단어 뜻 그대로 권한을 가진 서버로 Resource Owner를 인증하며, Client의 접근 자격을 확인하고 Access Token을 발급해 주는 역할을 합니다. Resource Server는 google, kakao, naver 등, 사용자의 보호된 자원*(리소스)*을 가지고 있는 서버를 말합니다.
Authorization Server와 Resource Server는 별개로 구분되어 있지만, 구성에 따라 아키텍처가 달라질 수도 있습니다.
Authorization Server와 Resource Server가 동일한 서버일 수도 있고, 별개의 서버일 수도 있으며, 하나의 Authorization Server가 여러 개의 Resource Server에 액세스 토큰을 발급할 수도 있습니다.
OAuth의 동작 과정
OAuth의 인증 과정은 크게 4단계로 이루어집니다.
첫째, 애플리케이션이 사용자에게 인증 요청
둘째, 사용자가 이 요청을 승인한 경우, 애플리케이션은 인증 서버에 코드를 요청
셋째, 애플리케이션은 이 코드를 사용하여 인증 서버로부터 액세스 토큰을 받음
넷째, 애플리케이션은 이 토큰을 사용하여 리소스 서버에 접근
KaKao로그인으로 알아보는 OAuth 동작 과정
Application의 사용자가 카카오톡 로그인 요청하면 Application에서는 URL을 생성하여 호출하게 됩니다
<https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}>
- 쿼리 파라미터
이름 | 타입 | 설명 |
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드를 전달받을 서비스 서버의 URI |
response_type | String | code로 고정 |
해당 쿼리파라미터의 경우 Third-Party Application마다 설정이 다르며 각각의 필수값들이 다를 수도 있습니다
사용자 동의 단계에서 사용자 선택에 따라 오는 응답 값이 또 다를 수 있습니다.
사용자 동의 단계에서 취소 버튼을 클릭하였을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?error=access_denied&error_description=User%20denied%20access
[동의하고 계속하기] 선택 했을 경우,
HTTP/1.1 302 Found Content-Length: 0 Location: ${REDIRECT_URI}?code=${AUTHORIZE_CODE}
사용자가 [동의하고 계속하기]를 선택했을 경우에 로그인이 진행되며 이때 오는 redirect_uri가 authorize_code를 이용해 token발급 요청을 보낼 수 있습니다.
redirect URI로 받은 인가코드를 가지고 token발급 요청을 보냅니다
메서드 | URL |
POST | https://kauth.kakao.com/oauth/token |
이름 | 타입 | 설명 |
grant_type | String | authorization_code로 고정 |
client_id | String | 앱 REST API 키 |
redirect_uri | String | 인가 코드가 리다이렉트된 URI |
code | String | 인가 코드 받기 요청으로 얻은 인가 코드 |
예제
curl -v -X POST "<https://kauth.kakao.com/oauth/token>" \\
-H "Content-Type: application/x-www-form-urlencoded" \\
-d "grant_type=authorization_code" \\
-d "client_id=${REST_API_KEY}" \\
--data-urlencode "redirect_uri=${REDIRECT_URI}" \\
-d "code=${AUTHORIZE_CODE}"
- 응답
이름 | 타입 | 설명 |
token_type | String | 토큰 타입, bearer로 고정 |
access_token | String | 사용자 액세스 토큰 값 |
expires_in | Integer | 액세스 토큰과 ID 토큰의 만료 시간(초) |
refresh_token | String | 사용자 리프레시 토큰 값 |
refresh_token_expires_in | Integer | 리프레시 토큰 만료 시간(초) |
access_token의 경우 클라이언트가 리소스 서버의 리소스에 접근하기 위한 권한을 부여받는 토큰입니다. 액세스 토큰은 권한 서버로부터 발급되며, 일반적으로 제한된 유효 기간을 가지고 있습니다.
refresh_token의 경우 액세스 토큰의 유효 기간이 만료된 후 새로운 액세스 토큰을 받기 위한 토큰입니다. 이를 통해 사용자는 다시 로그인할 필요 없이 토큰 유효 시간 갱신만으로 계속 애플리케이션을 사용할 수 있습니다.
참고
- kakao Developers