oauth 2.0 에 대해 알아보는 시간을 갖겠습니다.
여기서는 oauth 2.0 총 4방식 중 하나인 대표적으로 많이 사용되고 있는 Authorization code grant 방식 기반으로 설명하고자 한다.
보통 우리가 어디 웹사이트를 접속 하게 되면 ‘네이버로 로그인’, ‘카카오로 로그인’ 즉 SNS 아이디 통해 로그인 할 수 있는 페이지를 본적 있을 것이다.
예를들어 닥톡 사이트에 로그인을 할때 미리 가입한 카카오 계정을 통해 인증 처리 후 닥톡 회원 가입 및 로그인을 할 수 있다는 점인데
여기서 닥톡과 카카오와 긴밀한 관계가 아닌 이상 제 3자 즉 닥톡에 회원가입을 할려고 하는 사람에게 인증 처리를 할 수 없다.
그럼 어떻게 해서 닥톡, 카카오, 사용자 이 3자간에 신뢰가 가능 하면서도 인증 처리를 할 수 있도록 하는 것일까
먼저 카카오 ID, PASSWORD 를 닥톡 서버에 전달하고 닥톡은 해당 아이디와 패스워드를 어딘가에 저장하다가
필요할때면 카카오 서버에게 인증 처리 및 데이터를 얻는 방식이라면 어떨까?
이것은 아주 간단하면서 편리하지만 아주 위험한 발상이다.
카카오 입장으로 생각해볼때 닥톡에게 해당 카카오 유저 아이디 패스워드를 맡긴다는 것은 위험하고 나쁘게 말하자면
카카오 계정 통해 나쁜 행동을 할 수 있기 때문이다.
그럼 카카오 입장에서 닥톡에게 해당 유저 계정을 알려줄 필요없이 어떻게 하면 신뢰와 동시에 인증 처리 할 수 있도록 할까?
우선 oauth 에 사용되는 용어에 대해 알아보겠습니다.
Resource Server : 우리가 실질적으로 자원을 컨트롤 하는 서버를 지칭한다.
Resource Owner : 자원을 실질적으로 이용할려는 사용자
Client : Resource Server 에 접속해서 정보를 가져오는 역활을 하는 것
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
이제 준비가 끝난 상태입니다. 한번 실제로 Resource Owner 가 저 SNS 버튼을 클릭 하게 된다면 어떤 일이 일어나는지 알아봅시다.
먼저 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 입니다. (카카오 개발자 센터에 설정)
그럼 카카오로부터 로그인 페이지를 전달 받게 된다. Resource Owner 의 카카오 계정을 입력 후 로그인시
이전에 Client 와 Resource Server (KAKAO) 주거니 받거니 했던 Client Id 와 링크로 접속한 client Id 와 비교해서 맞으면 통과 틀리면 에러 페이지로 접속 하게 됩니다.
이렇게 Scope 동의 항목 관련 페이지로 접속 하게 됩니다. 이것은 미리 Client 와 Resource Server (KAKAO) 와 협의한 Scope 목록이 보입니다.
이 중에서 해당 동의 항목을 수락 할것인지 나타나게 됩니다.
그럼 Resource Owner 가 선택한 동의 항목을 확인하여 Resource Server (KAKAO) 는 이를 저장 및 관리 하게 됩니다.
다음으로 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 값을 보내줍니다.
{
"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: 리프레시 토큰 만료 시간(초)