OAuth 2.0
- 외부 소셜 계정을 기반으로 간편히 회원가입과 로그인을 할 수있는 웹 어플리케이션이 있는데, 이 때 사용되는 프로토콜이 OAuth이다.
OAuth를 사용하는 이유
- 다른 서비스의 회원 정보를 안전하게 사용하기 위한 방법
- 우리의 서비스를 사용하는 고객의 정보를 갖고있는 다른 서비스에서 우리 서비스에 안전하게 건네주기 위한 방법
- 고객이 자신의 네이버 ID/PW를 우리 서비스에 알려주지 않아도, 네이버에 있는 고객의 정보를 우리 서비스에서 안전하게 사용하기 위한 방법
Access Token
- OAuth 핵심
- 임의의 문자열로, 문자열의 정체는 이 토큰을 발급해준 서비스만 알 수 있음
- Access Token을 이용해 이 토큰값과 관련된 고객의 정보를 해당 서비스에 요청하고, 해당 서비스는 이 토큰을 검증하고 발급된게 맞다면 해당 고객의 정보를 넘겨준다.
- Access Token 존재 자체가 고객의 정보를 넘겨주는 것을 동의함의 징표
- Access Token을 넘겨주면 네이버는 정보를 넘겨준다. 참 쉽다. 이걸 위해서 우린 OAuth를 사용한다.
Access Token을 어떻게 받지?
- 당연하지만 네이버가 건네줘야 된다.
- 특정 고객이 네이버 로그인을 통해 회원임을 인증
- 네이버 로그인, 카카오 로그인 버튼을 클릭하면 네이버 로그인 페이지로 이동하고, 카카오 로그인 페이지로 이동한다. 그 고객임을 인증하기 위해서다.
Access Token 넘겨 받기
- 고객이 네이터 회원임을 확인하면 이 고객과 관련된 Access Token을 발급한다.
- 이 토큰을 우리 서비스에서 어떻게 받을 수 있을까?
넘겨 받은 토큰을 Redirect을 이용하여 우리 서비스로 받기
-
HTTP에는 리다이렉트 메시지가 존재한다. 이 메시지는 참으로 간단하다. 서버에서 클라이언트보고 어디로 가라고 지정해주는게 바로 리다이렉트다.
-
리다이렉트를 이용하면, 고객이 가만히 있어도 웹브라우저가 알아서 페이지를 이동한다. 이를 이용하면 고객이 직접 페이지를 이동할 필요가 없어진다.
-
고객이 로그인 ➞ 네이버에서 다시 우리 서비스로 리다이렉트 ➞ 고객은 가만히 앉아서 우리 서비스로 넘어올 수 있다.
-
그럼, 토큰값은 어떻게 받아올까? ➞ URL에 묶어서 건네주면 된다 ➞ query string
-
그럼, 이 리다이렉트 되는 URL은 어디일까? 네이버는 어디로 이 고객을 보내주면 될까? 리다이렉트 URL을 우리가 네이버에 알려줘야 될 것 같다. 그래야 URL에서 토큰값을 추출하는 로직을 해당 페이지에서 처리할 수 있게 구현할 수 있을테니 말이다.
-
우리도 URL에 리다이렉트 URL을 묶어서 네이버로 이동
-
이런 이유로, 네이버 로그인을 클릭하고 이동된 URL을 유심히 살펴보면, redirect_uri값이 있음을 알 수 있다.
문제점
- 어떤 악의적인 사용자가 XSS공격이나 피싱 사이트를 이용해서 redirect_uri를 자기가 원하는 사이트로 바꾸면 어떡하지? 그러면 그 공격자는 내 Access Token을 받을테고, 정보를 쉽게 알 수 있다
- 이런 위험을 막기 위해, 각 사이트는 OAuth를 사용하려면 우선 해당 서비스에 등록절차를 밟아야 한다.
- 즉, 우리 서비스에서 네이버 로그인 기능을 사용하려고 한다면 사전에 네이버에 등록을 하고 승인을 받아야 한다.
- 그리고 이런 등록 과정에서, 여러가지 정보를 기입하는데 이 때 redirect_uri도 사전에 미리 합의를 본다. 이미 합의된 redirect_uri가 아닌 다른 값으로 로그인 요청 페이지로 보냈다면, 네이버에서는 이를 수상한 행동으로 여기고 보내주지 않을 것이다.
정보 받기
우여곡절 끝에 Access Token을 우리 서비스에서 받았다. 그러면, 이제 이 토큰을 가지고 어떻게 회원의 정보를 얻을 수 있을까?아마 네이버에 Access Token을 건네주면, 이 토큰을 확인하고 네이버가 정보를 건네주는 페이지가 있을 것이다.
- 이렇게 말이다. 그 다음은 너무 쉽다. 네이버에서 하라는대로 Access Token을 넘겨주면, 네이버는 정보를 전달해준다. 끝!
정리
- OAuth는 위에서 살펴봤듯, 크게 3단계로 나뉘어져 있다.
- 서비스를 등록하는 과정
네이버에 자사 서비스 등록하기
이 과정에서 redirect_uri 등을 합의하기
- 토큰을 받기 위한 과정
사용자를 네이버 로그인 페이지로 이동시키기
네이버가 사용자를 우리 서비스로 리다이렉트 시키기
- 토큰을 이용해 정보를 요청하는 과정
나머지는 상세 구현이다. 어떻게 안전하고 편리하게 위의 과정을 진행할 것인지에 대한 고민의 결과가 바로 구현에 나타나 있는 것이다.이를 파악하면, 네이버 뿐만 아니라 다른 서비스들도 쉽게 사용할 수 있다. OAuth 2.0은 표준이 존재하기 때문에, 대부분의 서비스에서는 이 표준에 맞게 구현했을 것이기 때문이다.
references
https://velog.io/@undefcat/OAuth-2.0-%EA%B0%84%EB%8B%A8%EC%A0%95%EB%A6%AC
https://showerbugs.github.io/2017-11-16/OAuth-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://tecoble.techcourse.co.kr/post/2021-07-10-understanding-oauth/