OAuth란
서비스 공급자 입장이 되어 사용자에게
내 서비스 안에서 다른 서비스, 예를 들면 구글에 있는 사용자 정보를 일부 가져와
서비스하고 싶다
그럼 어떻게 해야 할까?
가장 원초적인 방식으로는 사용자의 구글 ID와 Password를 받아 대신 로그인하여
구글의 사용자 정보를 받아 서비스하는 것이다
하지만, 이는 서비스 공급자, 사용자, 구글
모두에게 보안적으로 위험하고 부담이 된다
그래서 이런 3자간 보안을 유지하면서 서비스를 제공할 수 있도록 인증 방식이 필요한데 그 표준화된 인증 방식이 바로 OAuth 이다
인증 방식
사용자의 ID와 Password의 역할로 accessToken이라는 것을 사용한다
이 accessToken은 보안성을 가질 뿐 아니라
사용자 정보를 갖고 있는 서버의 일부 정보 및 기능만
사용할 수 있게 제한할 수 있다
즉, 사전에 사용자에게 구글 캘린더에 대한 정보를 사용하겠다고
동의를 얻게 되면 그에 맞는 accessToken으로 서비스를 제공할 수 있게 된다
발급 과정
- 서비스 공급자 (client)
- 사용자 (resource owner)
- 사용자 정보를 갖고 있는 서버 (resource server)
이 3자간에 약속을 하고 보안성을 가져야 하기 때문에
accessToken을 발급하는 과정은 간단하지 않다
서비스 등록 → 사용자 승인 → 서버 승인 → accessToken 발급
서비스 등록
계속해서 서비스 공급자 입장으로 보면
사전에 내 서비스에서 리소스 서버의 자원을 사용하겠다고 승인을 받아야 함
그러기 위해서 내 서비스를 리소스 서버에 등록을 하게 되는데
이 때 필요한 공통 요소는 다음과 같다
- 공통 요소
- Client ID
- Client Secret
- Authorized redirect URI
- Client가 authorization code를 받을 주소
리소스 서버의 입장에서 서비스 공급자가 자원을 사용하는 것이기 때문에
서비스 공급자를 Client로 본다
사용자 승인
서비스 공급자가 사용자에게
리소스 서버에서 사용자의 정보를 가져다 쓰겠다는 동의를 얻기 위해
보통 다음과 같은 UI로 (리소스 서버에서 제공해준다)
사용자가 리소스 서버에 요청을 보내도록 한다
이 때, 담아야할 요청 파라미터로
- Client ID
- Scope
- 리소스 서버에서 사용할 자원
- Redirect URI
가 있는데 이는 서비스 공급자가 요청 URI에 미리 담아
사용자가 버튼 UI를 클릭할 때 리소스 서버로 전송한다
그렇게 사용자가 요청을 보내면 리소스 서버는
사용자에게 로그인을 요청한다
사용자가 로그인하게 되면 요청이 온
- Client ID
- Redirect URI
가 리소스 서버에 등록된 것인지 확인하고
- Scope
에 해당하는 정보를 사용해도 되는지
사용자에게 동의를 구한다
사용자 동의까지 정상적으로 이루어지면
리소스 서버는 사용자 아이디와 scope를 등록된 ClientId에 추가로
저장을 해준다
서버 승인
리소스 서버는 accessToken를 발급하기 전에
다시 한 번 확인을 위해 임시 비밀번호인 authorization code를 생성한다
그리고 이를 담아 사용자에게
- Redirect URI
로 redirect 요청을 한다
- Redirect URI
를 통해 authorization code를 받게 되면 서비스 공급자는
- authorization code
- Redirect URI
- Client Id
- Client Secret
을 담아 리소스 서버로 요청한다
accessToken 발급
리소스 서버는 서비스 공급자에게 accessToken 발급 요청을 받게 되면
최종으로 등록된 정보와 확인 후
생선한 authorization code은 지우고
accessToken을 생성하여 서비스 공급자에게 응답한다
이후 이 accessToken을 가지고 api를 사용하여 승인 받은 권한 내에서
리소스 서버의 정보를 사용할 수 있다
RefreshToken
accessToken의 경우 만료 기한이 있는데
만료 됐을 경우 accessToken을 재발급 받기 위한 토큰이다
refreshToken도 만료되면 갱신이 필요하다
댓글