본문 바로가기

OAuth 2.0

by 참새는 짹짹 2021. 1. 11.
WEB2 - OAuth 2.0 - 생활코딩
사용자가 가입된 서비스의 API에 접근하기 위해서는 사용자로부터 권한을 위임 받아야 합니다. 이 때 사용자의 패스워드 없이도 권한을 위임 받을 수 있는 방법이 필요합니다. 이를 위해서 고안된 기술이 OAuth입니다. 오늘날 많은 API들이 OAuth를 통해서 상호 연동을 지원하고 있습니다. 구글, 페이스북과 같은 서비스의 API에 사용자 대신에 접근하고 싶은 분들을 위한 수업입니다.
https://opentutorials.org/course/3405
💡
생활코딩의 'WEB2 - OAuth 2.0' 강의를 듣고 정리한 내용이므로 위 강의를 들으시면 더 쉽게 이해하실 수 있습니다

OAuth란


서비스 공급자 입장이 되어 사용자에게

내 서비스 안에서 다른 서비스, 예를 들면 구글에 있는 사용자 정보를 일부 가져와

서비스하고 싶다

그럼 어떻게 해야 할까?

가장 원초적인 방식으로는 사용자의 구글 ID와 Password를 받아 대신 로그인하여

구글의 사용자 정보를 받아 서비스하는 것이다

하지만, 이는 서비스 공급자, 사용자, 구글

모두에게 보안적으로 위험하고 부담이 된다

그래서 이런 3자간 보안을 유지하면서 서비스를 제공할 수 있도록 인증 방식이 필요한데 그 표준화된 인증 방식이 바로 OAuth 이다

인증 방식


사용자의 ID와 Password의 역할로 accessToken이라는 것을 사용한다

이 accessToken은 보안성을 가질 뿐 아니라

사용자 정보를 갖고 있는 서버의 일부 정보 및 기능만

사용할 수 있게 제한할 수 있다

💡
다시 구글로 예를 들면 구글 캘린더, Gmail, 구글 드라이버 등의 사용자가 가진 여러 정보 중 구글 캘린더에 대한 정보만 허용하는 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도 만료되면 갱신이 필요하다

'' 카테고리의 다른 글

쿠키와 세션  (0) 2021.01.15

댓글