프로젝트 전 소셜 로그인 기능을 구현하고 싶어서 OAuth 동작원리를 공부한 기록입니다.
OAuth를 사용하는 이유는 단순하게 말해 회원가입할 때 안전하게 소셜 로그인을 가능하게 해주기 때문이다. 원래는 소셜 로그인을 할 때 Client에 직접 해당 소셜에 아이디와 비밀번호를 입력해야 했지만 OAuth를 사용하면 실제 아이디와 비밀번호 대신 accessToken으로 로그인을 할 수 있다. 또한, Client는 회원들의 실제 아이디와 비밀번호를 보관하지 않고 회원들을 accessToken으로 식별 가능해 보안 이슈에 대비할 수 있다.
용어를 간단하게 표현하면
Resource Server
= 구글, 페이스북, 카카오 등Resource Owner
= 사용자Client
= 서버, 사이트
먼저 해당 Resource Server에 등록을 해야합니다.
Client가 등록을 하게 되면 Client, Resource Server 모두 (Client id, Client Secret, redirect URL)의 정보를 받습니다.
Resource Owner가 로그인 버튼을 누르면 (https://resource.server/?client_id=000%scope=000%redirect_url=000
) 와 같은 url로 이동되게 됩니다.
이동 후 Resource Server가 로그인 창을 Resource Owner에게 제공합니다.
Resource Owner가 로그인을 하면 Resource Server가 url을 확인하고 Client가 등록한 거와 같으면 Resource Owner한테 Client한테 정보를 제공한다는 확인창을 컴펌하고 확인하면 Resource Server가 Resource Owner는 scope 내용에 관한 허용을 인지했다고 이해합니다.
Resource Owner가 승인하면 Resource Server는 Resource Owner한테 authorization code를 전송합니다.
전송 후 authorization code가 다시 Client로 가고 Client가 Resource Owner에 해당하는 authorization code를 알게 됩니다.
그 후 Client는 authorization code를 가지고 Client id, Client Secret, authorization code를 전송하고 전송받은 데이터를 확인하고 인증을 끝낸 Resource Server는 authorization code를 지웁니다.(Client도 지움 (다시 인증을 안 하기 위하여))
Resource Server는 accessToken을 Client한테 발급하고 발급받은 Client는 accessToken을 저장 accessToken을 가진 Client가 Resource Server에 접근하면 accessToken을 가진 Resource Owner는 해당하는 scope 부분을 허용합니다.
accessToken은 api를 호출할 때 사용하고 (리소스 서버에 리소스를 가져올 때)
accessToken이 만료되면 accessToken과 같이 발급한 refresh token을 제공하여 다시 accessToken을 발급받습니다.
OAuth 원리를 이해하고 기능 구현 코드를 보니 코드를 이해하기 쉬워졌고 나도 할 수 있겠다는 자신감이 생겼습니다.
출처 : 생활코딩(https://opentutorials.org/course/3405) (egoing님 사랑합니다.)