OAUTH 2.0 이해하기
Writer: 서양훈

OAUTH 2.0

Formula

oauth 2.0 에 대해 알아보는 시간을 갖겠습니다.

여기서는 oauth 2.0 총 4방식 중 하나인 대표적으로 많이 사용되고 있는 Authorization code grant 방식 기반으로 설명하고자 한다.

보통 우리가 어디 웹사이트를 접속 하게 되면 ‘네이버로 로그인’, ‘카카오로 로그인’ 즉 SNS 아이디 통해 로그인 할 수 있는 페이지를 본적 있을 것이다.

예를들어 닥톡 사이트에 로그인을 할때 미리 가입한 카카오 계정을 통해 인증 처리 후 닥톡 회원 가입 및 로그인을 할 수 있다는 점인데

여기서 닥톡과 카카오와 긴밀한 관계가 아닌 이상 제 3자 즉 닥톡에 회원가입을 할려고 하는 사람에게 인증 처리를 할 수 없다.

그럼 어떻게 해서 닥톡, 카카오, 사용자 이 3자간에 신뢰가 가능 하면서도 인증 처리를 할 수 있도록 하는 것일까

Formula

먼저 카카오 ID, PASSWORD 를 닥톡 서버에 전달하고 닥톡은 해당 아이디와 패스워드를 어딘가에 저장하다가

필요할때면 카카오 서버에게 인증 처리 및 데이터를 얻는 방식이라면 어떨까?

이것은 아주 간단하면서 편리하지만 아주 위험한 발상이다.

카카오 입장으로 생각해볼때 닥톡에게 해당 카카오 유저 아이디 패스워드를 맡긴다는 것은 위험하고 나쁘게 말하자면

카카오 계정 통해 나쁜 행동을 할 수 있기 때문이다.

그럼 카카오 입장에서 닥톡에게 해당 유저 계정을 알려줄 필요없이 어떻게 하면 신뢰와 동시에 인증 처리 할 수 있도록 할까?

OAUTH 2.0 용어

Formula

우선 oauth 에 사용되는 용어에 대해 알아보겠습니다.

Resource Server : 우리가 실질적으로 자원을 컨트롤 하는 서버를 지칭한다.

Resource Owner : 자원을 실질적으로 이용할려는 사용자

Client : Resource Server 에 접속해서 정보를 가져오는 역활을 하는 것

OAUTH 2.0 인증

등록

Formula

oauth 인증 절차에 대해 설명 할려고 합니다.

우선 사전에 인증 로그인 진행 하기 전 등록이라는 절차가 필요하다.

즉 Resource Server(kakao) 로 부터 Client 에게 3가지 데이터를 받게 됩니다.

Client Id: 식별자 키값 즉 client 를 식별자 할 수 있는 키
Client Secret: 일종의 비밀키 나중에 인증 방식에서 토큰 발행시 사용된다. 외부에 절대 노출 해서는 안된다.
Redirect URL: 인증 방식에서 Access Token 발급 받기전 code 를 발급 받게 되는데 발급 받을 수 있는 URL 이라고 생각하면 된다. 그리고 해당 URL 은 Client 측이 Resource 서버 개발자 페이지에 등록한다.
Scope: 인증시 동의항목 데이터 (ex: 카카오 가입시 등록된 이름, 프로필 이미지, 이메일 등)

이 3가지 데이터는 client 서버에 보관해야 합니다. 나중에 인증할때 꼭 필요한 데이터 입니다.

개발자센터 링크

Google : https://console.developers.google.com
Naver : https://developers.naver.com
Kakao: https://developers.kakao.com

인증 받는 과정

Formula

이제 준비가 끝난 상태입니다. 한번 실제로 Resource Owner 가 저 SNS 버튼을 클릭 하게 된다면 어떤 일이 일어나는지 알아봅시다.

Formula

먼저 https://web.doctalk.co.kr/login 로그인 페이지를 접속 하게 되면 sns 로그인 버튼이 보입니다.

예를들어 ‘카카오 계정’ 버튼을 클릭시 이동되는 링크를 확인 해보면

https://kauth.kakao.com/oauth/authorize?
client_id=test&
response_type=code&
scope=profile_nickname,account_email&
redirect_uri=https://api/doctalk/callback

카카오 인증 서버로 이동 하게 되고 각각의 파라미터를 확인해보면

client_id: 기존에 카카오부터 발급 받았던 Client 식별자 키값 입니다.

response_type: ‘code’ 라고 되어 있는데 이는 Oauth 2.0 에서 인증 방식을 Authorization code grant 방식 기반 하겠다는 의미 입니다.

scope: 카카오 개발자 센터에 설정한 인증시 동의항목 데이터 입니다.

redirect_uri: access token 을 받기 위한 code 를 받게 되는데 콜백 URL 입니다. (카카오 개발자 센터에 설정)

Formula

그럼 카카오로부터 로그인 페이지를 전달 받게 된다. Resource Owner 의 카카오 계정을 입력 후 로그인시

이전에 Client 와 Resource Server (KAKAO) 주거니 받거니 했던 Client Id 와 링크로 접속한 client Id 와 비교해서 맞으면 통과 틀리면 에러 페이지로 접속 하게 됩니다.

Formula

이렇게 Scope 동의 항목 관련 페이지로 접속 하게 됩니다. 이것은 미리 Client 와 Resource Server (KAKAO) 와 협의한 Scope 목록이 보입니다.

이 중에서 해당 동의 항목을 수락 할것인지 나타나게 됩니다.

그럼 Resource Owner 가 선택한 동의 항목을 확인하여 Resource Server (KAKAO) 는 이를 저장 및 관리 하게 됩니다.

Formula

다음으로 Resource Server (KAKAO) 는 Resource Owner 에게 응답 Herder 로

미리 Client 와 Resource Server (KAKAO) 와 협의한 Redirect URL 함께 Access Token 을 발급 받기 위한 CODE 값 포함한 URL 을 받게 되고

해당 URL 로 접속하게 되면 Client 서버는 Code 값을 받아 Resource Server (KAKAO) 에게

POST - https://kauth.kakao.com/oauth/token? 
client_id=test&
client_secret=1234&
response_type=authorization_code&
code=test_code&
redirect_uri=https://api/doctalk/callback

해당 URL 을 전송 하게 됩니다.

client_id: 기존에 카카오부터 발급 받았던 Client 식별자 키값 입니다.

client_secret: 카카오 부터 발급 받았던 secret 키 입니다.

response_type: Oauth 2.0 에서 인증 방식을 Authorization code grant 방식 기반 하겠다는 의미 입니다.

code: Resource Server (KAKAO) 으로 부터 발급 받았던 임시 비밀번호 입니다.

redirect_uri: access token 을 받기 위한 code 를 받게 되는데 콜백 URL 입니다. (카카오 개발자 센터에 설정)

이렇게 전달 받은 Resource Server (KAKAO) 는 하나하나 씩 값을 유효한지 체크 하게 됩니다.

Resource Server (KAKAO) 는 값이 유효하다고 판단 되면 code 값을 다시 사용 할수 없도록 하고

마지막인 Access Token 값을 보내줍니다.

Formula

{ 
    "access_token":"{ACCESS_TOKEN}", 
    "expires_in":43199, 
    "refresh_token":"{REFRESH_TOKEN}", 
    "refresh_token_expires_in":25184000, 
    "scope":"profile_nickname,account_email"
}

access_token: 사용자 액세스 토큰 값
expires_in: 액세스 토큰 만료 시간(초)
refresh_token: 사용자 리프레시 토큰 값
refresh_token_expires_in: 리프레시 토큰 만료 시간(초)