프로젝트 인프라 #08 OAuth2 개념
2022/12/01
- 학습내용
학습 환경
백엔드 입장에서 서버를 배포하고 구현하는 서비스가 있다.
사용자가 내 서비스를 이용할 때 서비스 내에 회원가입/로그인 방식을 사용해 접근한다.
이럴 때 사용자는 하나하나 정보를 입력해가며 회원가입/로그인 하는 방식보다 편한 방법으로 접근하고 싶어한다.
그 편한 방법에는 카카오, 구글 등의 계정을 이용해서 접근하는 방법이 있다.
내 서비스에서 소셜로그인 서비스 사용하는 것을 동의합니다 만 클릭하면되는 간편한 방법이다.
하지만 그러기에는 보안문제가 있다.
그 동의합니다 를 클릭하기에는 본인의 카카오, 구글 등의 개인정보가 걱정된다.내 개인정보가 처음 보는 사이트에서 가져가는 것은 개인정보 유출 문제도 있기 때문이다.
그래서 사용하는 것이 OAuth2다.
1.OAuth2 역할 및 구조
OAuth2 적용 시 역할
카카오, 구글, 페이스북 = Resource Server (데이터를 가지고있는 서버)
카카오, 구글, 페이스북 = Authorization Server (인증과 관련된 처리를 전담하는 서버)
유저 = Resource Owner
나 = Client
OAuth2 적용 구조
유저의 아이디와 비밀번호를 Client에서 가지고 있었는데
그들의 요청에 의해서 유저의 아이디와 비밀번호를 카카오가 accessToken으로 발급한다.
accessToken사용의 장점
유저의 아이디와 비밀번호가 직접 보이지 않고 accessToken으로 보내진다.
그들의 서비스 전체를 받는 것이 아니라 나의 서비스에 필요한 필수적인 정보만 받을 수 있다.
카카오의 accessToken을 나의 서비스가 획득한 다음에 accessToken을 통해서 카카오의 서비스에 접근을 해서
데이터를 가져오고 수정/생성/삭제를 할 수 있는 것이다.
2. OAuth2 등록
Client가 resource server를 사용하기 위해서는 사전에 승인을 받아야 한다.
그것을 등록refister이라고 한다.
보통 세가지 요소를 공통적으로 받는다.
1. ID =우리가 만들고 있는 애플리케이션을 식별하는 식별자
2. SECRET는 그 식별자에 대한 비밀번호
-> ID는 노출은 해도 문제없지만 SECRET 절대 노출되면 안된다. 그 자체가 보안사고다.
3. Authorized redirect URLs 는 Authorize code를 전달해줄건데 이 URLS로 전달해준다.
이제 이 세가지 요소 사항을 카카오에 입력해서 카카오가 이 사항을 알게 되는것이다.
이제 유저가 내 서비스에 접근할 때 로그인에 저런 버튼을 띄어주게된다.
저 버튼은 옆에 링크로 통하게 된다.
링크 내용을 보면
Client_id =1 -> 내 서비스 id 값
scope = 우리가 사용하고자 하는 기능
redirect = 리다이렉트 url값
3. Resource Owner의 승인
등록이 완료되면 클라이언트와 리소스 서버 서로 클라이언트 ID와 클라이언트 secret을 알게된다.
리소스 오너(유저)가 승인을 해주고 리소스 서버가 승인을 해준다.
엑세스 토큰 발급 전에
리소스 서버는 임시 비밀번호로 쓰는 authorization code를 리소스 서버는 리소스 오너에게 전송한다.
리소스 서버는 header에 Location이라는 값을 주어 넘겨준다.
리소스 서버가 리소스 오너의 웹브라우저에 https://~~code=3으로 이동하라고 명령을 준거다.
그럼 오너의 웹브라우저는 https://~~code=3로 이동하게 되는데 그곳이 client 서비스의 위치다.
이제 리소스 오너가 로그인하면 리소스 서버에서 클라이언트ID, 클라이언트 secret이 같은지 확인한다.
같다면 리소스 오너에게 권한을 확인할것인지 메세지를 보내고 허용 버튼을 누르면 리소스 서버에서 리소스 오너의 정보를 수집한다.
5. Resource Server의 승인
리소스 서버가 승인을 위해 authorization code를 리소스 오너에게 전달한다.
이때 url을 받는데 이를 통해 리소스 오너가 클라이언트에게 authorization code를 준다.
authorization code를 받은 클라이언트는 모든 정보를 합쳐서 리소스 서버에게 넘긴다.
정보가 모두 일치하는것을 확인한 리소스 서버가 액세스 토큰을 발급해서 클라이언트에게 준다.