인프라
생활코딩 OAuth 2.0 강의와 놀토의 OAuth
newwisdom
2021. 8. 20. 00:33
반응형
개요
나의 서비스가 사용자를 대신해 그들의 서비스의 기능에 접근한다.
- 사용자로부터 그 사용자가 사용하고 있는 그들의 서비스에 접근할 수 있도록 허가를 받아야 함
- 근데 사용자 입장에서는 처음 보는 서비스에게 그들의 서비스 인증정보를 맡기긴 무서움 제 삼자가 내 인증정보를 가지고 있는 것임
- OAuth 프로토콜을 써보자!
- 그들의 서비스가 accessToken을 발급해줌 (아이디와 비번이 아님)
- 나의 서비스가 필수적으로 필요한 기능만 허용함
- 우리의 서비스는 accessToken를 통해 그들의 서비스를 이용할 수 있음
- 회원의 아디와 비번을 가지지 않아도 됨
역할
Resource Owner
- User
- 우리의 서비스를 이용하는 사용자
- 우리가 제어하고자 하는 자원의 소유자
- 나의 서비스를 이용하는 클라이언트
Client
- Resource Server에 접속해 정보를 가져감
- 나의 서비스
Resource Server
- 우리가 제어하고자 하는 자원을 가진 서버
- 데이터를 가진 서버
- 나의 서비스가 연동하려는 그들의 서비스
Authorization Server
- 인증과 관련되 처리를 전담하는 서버
- 사실 Resource Server랑 퉁쳐서 말함
등록
- 클라이언트가 Resource Server를 이용하기 위해서는 리소스 서버의 승인을 사전에 받아놓아야 함
- 서비스마다 등록하는 방법은 다르지만 공통 요소가 있음
필요 정보
Client ID
- 클라이언트의 식별자
- 노출되어도 상관없음
Clinet Secret
- 이것에 대한 비밀번호
- 절대 노출되어서는 안됨
Authorized redirect URIs
- 리소스 서버가 권한을 부여하는 과정에서 code를 주는데, 해당 url로 정달해달라는 명시
인증
- 등록을 하게 되면 리소스 서버와 클라이언트는 Client ID, Client Secret는 동시에 알고 있는 상태가 됨
- 클라이언트는 Authorized redirect URI에 대한 페이지를 구현하고 있어야 함
- 최소한의 기능에 대해서만 인증을 받고 싶음
- 리소스 오너는 클라이언트에 접속한다.
- 접속을 하는 과정에서 리소스 서버를 사용해야하는 상황이 온다.
- ex) 페이스북 글 게시 등...
- 그러면 소셜 로그인 창으로 이동한다. 소셜 인증이 필요함
- 리소스 오너가 리소스 서버로 접속하면 리소스 서버는 로그인 여부를 확인함
- 로그인이 안되어 있으면 로그인 창으로 유도
- 로그인 성공하면 리소스 오너가 보낸 클라이언트 id 값과 같은 클라이언트 id가 있는지 확인
- 요청의 Authorized redirect URI과 리소스 서버가 가진 Authorized redirect URI이 같은지 확인
- 다르면 작업 끝냄
- 같으면 리소스 오너에게 어디까지 권한을 허용할건지 물어봄
- 허용 버튼을 누르면 리소스 서버에 그 정보를 전송
- 필수 기능에 대한 권한을 허용하였다는 정보를 처리 (SCOPE)
Resource Server의 승인
사용자가 승인 버튼을 눌렀을 때, 리소스 서버가 권한을 획득하게 된다.
이제는 리소스 서버가 승인을 해주어야 하는데, 이 때 액세스 토큰을 바로 발급하지 않는다.
authorization이라는 임시 비밀번호를 사용한다.
authorization를 리소스 서버가 리소스 오너에게 Location 헤더 값으로 전달한다.
그러면 리소스 오너는 모르는 사이에 저 Location으로 리다이렉트를 하게 된다.
그러면 클라이언트는 authorization를 얻게 된다.
그러면 클라이언트는 리소스 서버에 직접 접근을 하게 된다.
authorization과 client secret을 함께 전송한다.
이 때 리소스 서버는 client id에 해당하는 authorization와 secret 등 모든 정보가 일치하는지 검증한다.
액세스 토큰 발급
리소스 서버는 authorization를 통해 인증을 했기 때문에 이를 지워도 된다.
이후 리소스 서버는 accessToken을 클라이언트에게 발급한다.
클라이언트는 이 accessToken을 내부적으로 저장하게 된다.
리소스 서버는 이 accessToken을 보고 userId 1번에 대한 사용자에 대해 유효한 범위 정보에 대해 허용을 해야겠다라고 생각하고 동작하게 한다.
놀토의 OAuth 흐름
참고로 레벨 3 프로젝트에서는 Spring Security 사용이 제한되어 있었다.
때문에 Spring Security를 사용하지 않고 OAuth를 구현하기 위해 다음과 같은 흐름을 가져가게 되었다.
- 프론트에서 소셜 로그인 버튼(GITHUB/GOOGLE)을 누르면 해당 소셜 타입을 path parameter에 담아 요청을 보낸다.
- 백엔드에서는 소셜 타입에 해당하는 client_id, redirect_uri, scope, response_type을 DTO로 응답해준다.
- 프론트에서는 해당 정보들을 query param에 담아 해당 소셜 로그인 페이지로 요청을 보낸다.
- 소셜은 callback url에 authorization을 의미하는 code를 담아 보낸다.
- 프론트에서는 소셜이 리다이렉트 시킨 callback url에 대한 임시 방편 페이지에서 code를 추출한다.
- 추출한 code를 가지고 백엔드에게 회원가입 또는 로그인을 의미하는 요청을 보낸다.
- 백엔드는 해당 code를 가지고 소셜에 유저 정보를 요청한다.
- 백엔드는 응답받은 유저 정보로 이미 존재하는 회원인지 확인한다.
- 존재하지 않다면 저장(회원 가입)한다.
- 해당 정보를 가지고 accessToken을 만들어 프론트에게 응답한다.
참고자료
반응형