본문 바로가기
Network/Server

[Server] oAuth 의 개념

by 며루치꽃 2021. 6. 22.

전문적인 정보를 다루는 것이 아닌 개인적으로 학습한 내용에 대해

포스팅을 했기 때문에 이점을 감안하여 봐주시면 감사하겠습니다👏

 

oAuth는 나의 서비스가 존재하고, 사용자가 있을 때, Facebook이나 트위너 같은 인터넷 서비스의 기능을 다른 어플리케이션에 사용하고 싶을 때 사용하게 됩니다. 

예를 들면, 사용자가 내가 만든 서비스에서 글을 썻다면, 나의 서비스가 사용자를 대신해서 구글 캘린더에 날짜를 기록한다 또는 페이스북에 글을 대신해서 쓰고 싶을 경우가 있습니다.

그러기 위해서는 사용자로부터, 사용자가 사용하고 있는 인터넷 서비스에 접근할 수 있도록 허가를 받게 해줘야합니다.

가장 쉬운 방법은 서비스 제공자가 유저로부터 ID, Password를 제공받아서 기억하고 있다가 인터넷 서비스를 접속할 때 ID, Password를 이용하는 방법입니다. 이는 간단하지만, 매우 위험한 방법입니다. 그 이유는 처음 보는 인증되지 않은 서비스가 ID, Password를 가지고 있을 경우, 믿을 수가 없고 서비스가 보안 위험에 노출될 수 있기 때문입니다.

 

이러한 문제를 해결할 수 있는게 oAuth입니다. oAuth를 사용하게 된다면, 안전하게 우리가 만든 서비스가 인터넷서비스로 상호작용할 수 있게 됩니다.

 

oAuth를 사용하게 된다면, 인터넷 서비스는 user의 요청에 의해서 ID, Password를 대신해 Access Token을 발급하게 됩니다.

Access Token를 발급시 좋은 점은 다음과 같습니다.

1. 인터넷 서비스의 ID, Password가 아니다.

2. 인터넷 서비스의 모든 기능이 아니라 그 중 나의 서비스가 꼭 필요한 필수적인 기능만 부분적으로 허용합니다.

 

oAuth를 이용하여 나의 서비스가 발급받은 인터넷 서비스의 Access Token을 획득한 이후에, 그 Access Token을 이용해서 인터넷 서비스의 CRUD를 할 수 있게 도와줍니다.

 

oAuth에서는 방금 소개했던 나의 서비스가 존재하고, 사용자가 있을 때, Facebook이나 트위너 같은 인터넷 서비스를 각각 다음과 같은 명칭으로 구분하게 됩니다.

 

oAuth의 구성

 

사용자 - Resource Owner

자원을 소유하고 있는 사람

 

나의 서비스 - Client

Resouce Server에 접속해서 정보를 가져가는 Client

 

인터넷 서비스 - Resource Server

우리가 제어하고자하는 자원을 가지고 있는 서버

 

Authorization Server

인증과 관련된 것을 처리하는 서버

 

1. oAuth의 등록

 

Client가 Resource Server를 사용하기 위해서는 register(등록) 과정이 필요합니다. 

 

등록에는 Client ID, Client Secret, Authorized redirect URL가 필요합니다.

Client ID : 어플리케이션을 식별하는 식별자

Client Secret: 외부에 노출되면 안되는 비밀번호

Authorized redirect URL: Resource Server가 권한을 부여하는 과정에서 Authorized Code라는 값을 전달해줄 때 해당주소로 반환해달라는 주소입니다. 그렇게 되면 Resource Server는 redirect URL이 아닌 곳에서 요청을 하면 요청을 무시하게 됩니다. 

 

2. Resource Owner의 승인

등록 과정을 지나게 되면 Access Token안에 들어있는 정보를 Resource Server와 Client가 알 수 있게 됩니다. 그리고 Client는 redirect URI를 준비를 해놔야합니다.

 

예를 들어 Resource Server가 가지고 있는 기능이 A, B, C, D가 있는데 Client는 B, C 기능을 원했을 경우 과정은 다음과 같습니다.

 

먼저, Resource Owner가 Client에 접속을 할때 접속을 하는 과정에서, Resource Server를 사용해야하는 상황이 있다면, Client에게 '네이버로 로그인하기', '카카오톡으로 로그인하기' 라는 화면을 보여주게 됩니다.이 과정에서는 Resource Owner가 동의를 해야 다음 과정으로 넘어갈 수 있게 됩니다. 버튼을 누르게 되면 동의한다는 뜻이 되게 되는데 동의를 하게 되면 다음과 같은 링크를 생성합니다.

 

https://resource_server/?client_id=1&scope=B,C&redirect_URL=https://client/callback

위의 코드의 의미는 client_id=1, 사용하고자 하는 기능 scope=B,C , redirect_URL=https://client/callback 라는 링크를 만든다는 의미입니다.

 

Resource Owner가 Resource Server로 접속을 저 주소로 하게되면, Resource Server가 그 주소로 로그인이 되어있는지 확인한 다음 로그인이 성공이 되었다면 Resource Server는 로그인했을 때 나오는 Client ID와 같은 Client ID 값이 있는지 확인을 하게 됩니다. 그리고 자신이 갖고 있는 Client ID에 해당하는 redirect URL과 비교해서 다르면 작업을 끝내고, 같다면 Resource Owner에게 Scope에 해당되는 권한을 Client에게 부여할 것인지 확인하는 메시지를 보내게 됩니다. 이 메시지를 허용을 하게 되면 Resource Owner가 Resource Server에게 허용했다고 알려주게 됩니다.

 

 

그렇게 되면 Resource Server는 Resource Owner가 user id와 scope를 허용하였다는 정보를 DB에 저장하게 됩니다.

 

3. Resource Server의 승인

 

Resource Owner에 대한 승인을 받은 이후에는 Resource Server가 승인을 해줘야합니다. 

Resource Server는 Resource Owner에게 authorization code를 전송하게 됩니다. 

Resource Server는 Resource Owner에게 Header에 authorization code와 함께 다음과 같이 전송을 하게 됩니다.

Location: https://client/callback?code=3

위 코드는 Resource Server가 Resource Owner의 브라우저에게 해당 주소로 이동하라는 명령입니다.

 

그렇게 되면 Resource Owner의 브라우저는 해당 주소로 Client로 접속을 하게 되는데 code 값에 의해서 Client는 authorization code를 갖게 됩니다. 

 

해당 단계는 Access Token을 발급받기 직전 단계까지 온 상태입니다. 

 

Client는 Resource Owner를 통하지 않고 Resource Server에게 직접 접속합니다.전송을 할때는 authorization code, redirect URL, client ID, client Secret 값을 전송을 합니다.

 

authorization code와 client Secret 값을 결합해서 Resource Server에게 전송을 하게 됩니다.

그렇게 되면, Resource Server는 authorization code에 해당되는 값이 맞는지 확인을 하게 됩니다. 

authorization code, redirect URL, client ID, client Secret을 일치하게 되면 Access Token을 발급하게 됩니다.

 

4. Access Token 발급

Access Token을 발급을 하면 Resource Server는 authorization code를 통해서 이미 인증을 하였기 때문에 authorization code를 삭제합니다. 

 

Resource Server는 Access Token을 발급한 후에 Client에게 Access Token를 전달하고 Client는 내부적으로 Access Token을 저장을 하게 됩니다. 

Access Token은 Client가 Access Token으로 접근을 하게 된다면 userID에 해당하는 권한을 허용을 해야겠다라고 생각하고 동작하게 됩니다.


네이버 D2에 좋은 요약 참고 설명이 있어 같이 첨부하게 되었습니다.

 

  • 참고

- 생활코딩 님의 ' oAuth강의'

- https://d2.naver.com/helloworld/24942

댓글