[Security] OAuth2.0

impala·2023년 7월 19일
0
post-thumbnail

OAuth 2.0

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. - wikipidea

OAuth 2.0(Open Authorization 2.0)은 웹 어플리케이션에서 다른 서비스의 사용자 정보에 대해 접근하고자 할 때 안전하게 사용자의 정보를 열람할 권한을 부여해주는 프로토콜로, 소셜 로그인이나 외부 기능이 필요할 때 사용된다.

OAuth 2.0 참여 주체

  • Resource Owner(리소스 소유자): 서비스가 접근하려는 자원(개인정보 등)을 소유하고있는 주체로, 클라이언트에게 자원의 접근 권한을 허가해준다. 일반적으로 서비스 사용자에 해당한다.
  • Client(클라이언트): 보호된 자원을 사용하려는 주체로, 일반적으로 서비스를 제공하는 어플리케이션 서버에 해당한다.
  • Authorization Server(인증 서버): 사용자를 인증하고 클라이언트에게 자원에 대한 접근 권한을 부여하는 서버로, 사용자로부터 ID/PW받아 인증하고 클라이언트로부터는 Authorization code를 받아 Access Token을 발급해준다.
  • Resource Server(리소스 서버): 자원을 저장하고 호스팅해주는 서버로, 주로 사용자의 개인정보를 보관하고있는 구글이나 카카오등의 회사서버에 해당한다.

이 주체들을 기반으로 위에서 정의한 OAuth2.0을 다시 설명하자면

클라이언트가 사용자의 리소스를 사용하기 위해 인증서버를 통해 권한을 부여받는 프로토콜

이라고 말할 수 있다.

OAuth2.0 주요 용어

  • Authorization code: 클라이언트에게 리소스 접근 권한을 부여하기 전에 클라이언트를 인증하기 위한 코드. Access Token발급에 사용됨
  • Access token: 클라이언트에게 리소스에 대한 접근 권한을 부여하는 토큰
  • Refresh token: Access token을 갱신하기 위한 토큰
  • Client ID / Client Secret Password: 클라이언트를 인증하기 위한 ID/PW
  • Scope: 클라이언트가 접근할 수 있는 리소스의 범위(권한)
  • Redirect URI: 인증서버가 사용자 인증 후 Authorization code를 전송할 클라이언트의 URI

이때 Authorization code는 이 클라이언트에게 리소스 소유자가 접근권한을 허가했다는 의미로 사용된다.

OAuth2.0 인증/인가 과정

먼저 사용자(리소스 소유자)는 클라이언트의 서비스를 사용하기 위해 클라이언트 서버에 로그인을 요청한다. 그러면 클라이언트 서버는 자신의 식별자인 ClientID와 인증 서버로부터 승인 코드를 받을 URI(Redirect URI)를 포함하여 사용자에게 응답한다.

그 다음 사용자는 인증서버에 ClientID와 Redirect URI를 포함하여 로그인을 요청하면 인증서버에서는 ClientID를 통해 사전에 등록된 클라이언트인지 확인한 뒤 로그인 페이지를 보낸다. 이후 사용자가 ID/PW를 입력하여 로그인하면, 인증 서버에서는 승인 코드를 발급하여 Redirect URI로 전송한다.

Redirect URI를 통해 승인 코드를 받은 클라이언트는 인증서버에 승인 코드를 보내 리소스에 대한 접근 권한을 요청하고, 인증서버는 승인코드의 유효성을 검사한 뒤 클라이언트에게 Access token을 발급해준다.

마지막으로 클라이언트는 발급받은 Access Token을 사용하여 리소스 서버에 사용자의 리소스를 요청하면, 리소스서버에서 토큰을 검증한 뒤 클라이언트에게 리소스를 제공한다.

전체적인 과정을 그림으로 나타내면 아래와 같다.

그림에서 사용자가 인증서버에 로그인 요청을 보내는 URI는 다음과 같다.(3번 과정)

https://{authorization_server_url}
?client_id={client_id}
&response_type=code
&redirect_url={client_redirect_uri}
&scope=profile email
&state={CSRF_token}
...

URI를 분석해보면 인증서버의 url에 쿼리 파라미터로 클라이언트로부터 받은 client_id와 redirect_uri를 전달하는 것을 볼 수 있다. response_type이라는 파라미터는 OAuth2.0 프로토콜 중 Authorization Code Grant(권한 부여 승인코드 방식)을 사용한다는 의미로, OAuth2.0에서는 다양한 클라이언트 환경을 고려하여 이 방식 외에도 3가지 인증 프로토콜이 추가로 존재한다.

인증이 완료되면 HTTP Response의 Location헤더에 아래와 같이 redirect_uri와 승인코드를 담아 클라이언트로 리다이렉트 되도록 응답한다.

https://{redirect_uri}?code={Authorization_code}

참고 자료

2개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 좋은 글이었어요, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 8월 23일

OAuth 2.0 wordle unlimited 프로토콜은 클라이언트가 인증 서버를 통해 사용자 리소스에 액세스할 수 있도록 권한을 부여하는 안전하고 효율적인 수단을 제공한다는 점에서 부인할 수 없는 가치가 있습니다.

답글 달기