OAuth2 란
OAuth2 등장배경
어떤 기업이 다른 기업의 서비스를 제공받아 사용하기 위해서 정상적인 요청인지 확인이 필요합니다.
예를 들어 카카오의 친구들을 가져와 친구들이 어떤 게시물을 올렸는지 알려주는 서비스가 있다고 가정을 해봅시다.
카카오 입장에서는 우리가 요청하면 사용자의 개인정보이기 때문에 원하는 응답을 받을 수 없습니다.
그렇다면 기존 사용자에게 카카오 아이디와 패스워드를 넘겨받으면 어떻게 될까요?
위와 같이 응답을 받을 수는 있으나 CSRF 인지 진짜 사용자인지 알 수 없을뿐만 아니라 중간에서 해커가 정보를 탈취하게 된다면 사용자의 계정정보가 털리게 됩니다.
그렇다면 올바른 사용자인지 다른 인증방식을 선택해야하는데 여기서 나온것이 OAuth 입니다.
(기업들마다 다른 인증방식을 사용하다 개발자의 유지보수가 힘들어서 나온것이 OAuth 입니다.)
OAuth2 란
등장배경을 이해하게되면 자연스럽게 OAuth2 가 어떤일을 할지 예상할 수 있게 됩니다.
OAuth2는 우리가 만든 서비스에서 다른 서비스의 데이터를 가져오기 위해 사용자로부터 접근 권한을 위임받는 표준 프로토콜입니다.
OAuth2 종류
OAuth2 는 총 4가지의 종류로 구분하고 있습니다.
- Authorization Code Grant
- 권한 부여 승인 코드 방식
- 가장 많이 쓰이고 기본이 되는 방식
- Implicit Grant: 암묵적 승인 방식
- 자격 증명을 안전하게 저장하기 힘든 클라이언트(우리가 만든 서비스)에게 최적화된 방식
- Resource Owner Password Credentials Grant: 자원 소유자 자격증명 승인 방식
- 위에서 설명한 아이디와 패스워드를 받는 방식
- 클라이언트(우리가 만든 서비스)와 우리가 만든 다른 서비스일때만 사용해야하는 방식
- Client Credentials Grant
- 클라이언트가 자격증명만으로 Access Token 을 받는 방식입니다.
위에서 나온 4가지 중 가장 많이 사용하는 방식인 Authorization Code Grant에 대해 설명할려고 합니다.
OAuth2 동작방식 (Authorization Code Grant)
Authorization Code Grant 의 경우 먼저 사용할 서비스(카카오 같은 플랫폼)에게 자신의 서비스를 등록해야 합니다.
카카오 로그인을 예시로 들어보겠습니다.
사전작업
먼저 사전작업으로 Redirect URI 를 등록해야 합니다. 여기서 말하는 Redirect URI 는 인증을 마쳤을 때 사용자를 리다이렉션할 위치를 말합니다.
카카오의 경우에는 플랫폼을 등록하는 과정도 추가로 실시하고 있습니다.
위와 같이 사전작업을 끝내면 Client ID 와 Client Secret를 받게됩니다. 발급된 Client ID 와 Client Secret 는 액세스 토큰을 획득하는데 사용이 됩니다.
(Client Secret 는 절대 외부에 공개되어서는 안됩니다.)
동작 방식
먼저 카카오가 어떻게 인증을 얻는지 알아봅시다.
출처: https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
참고)
Service Client: 실제 사용자
Service Server: 내가 만든 서비스
Kakao Auth Server: 카카오 인증 서버
Step1 인가코드 받기
HTTP/1.1
GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code
Host: kauth.kakao.com
위처럼 auth Server 가 제공하는 url 에 client_id, redirect_uri, reponse_type, scope 등 매개변수를 쿼리 스트링으로 포함하여 보냅니다.
- client_id: 사전작업을 통해 얻은 client_id
- redirect_uri: 사전작업에서 적은 우리 서비스의 uri
- response_type: code 로 사용 (인증이 성공할 경우 Authorization Code 를 받을 수 있습니다.)
- scope: 클라이언트가 부여받은 리소스 접근 권한(카카오에서는 사용하지 않음.)
응답으로 code에 auth 인증에 사용될 Authorization Code 를 받게 됩니다.
Step2 토큰 받기
아까 받은 Authorization Code 를 다시 auth Server 에게 전달하고 Access Token 을 받게 됩니다.
POST /oauth/token HTTP/1.1
Host: kauth.kakao.com
Content-type: application/x-www-form-urlencoded;charset=utf-8
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}
요청할 때 다음과 같은 파라미터를 적습니다.
- grant_type: authorization_code 로 고정
- client_id: 아까 받은 client_id (api 키)
- redirect_uri: 사전작업에서 입력한 url
- code: 아까 받은 Authorization Code 를 입력 (인가 코드)
- client_secret: 필수는 아니지만, 보안을 강화하기 위해 추가 확인하는 코드
위와 같이 요청하게 되면 AccessToken 을 받게 되면 사용자에게 로그인이 성공했음을 알립니다.
이제 카카오의 리소스가 필요하면 방금 받은 Access Token 을 가지고 카카오에게 요청하면 데이터를 얻을 수 있습니다.
OAuth2 정리
카카오에서 OAuth2 를 사용하여 카카오 로그인을 구현한 것처럼 다른 회사도 모두 같은 방식의 프로토콜을 사용하고 있습니다.
참고) 네이버: https://developers.naver.com/docs/login/devguide/devguide.md#3-4-2-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%97%B0%EB%8F%99-url-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0
oauth 에서 가장 많이 쓰이는 방식인 Authorization Code Grant을 알아봤습니다.
정리하자면 oauth 는 외부 서비스가 우리 서비스를 인증된 서비스인지 확인하는 작업입니다.
Reference
https://hudi.blog/oauth-2.0/
https://blog.naver.com/mds_datasecurity/222182943542
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Leave a comment