스프링 일지

[Spring] OAuth2 / 액세스 토큰 개념 정리

뉴이네 2024. 1. 10. 13:39

 

OAuth2 서비스란?

 

OAuth2는 인터넷 사용자들이 비밀번호를 공유하지 않고, 웹사이트들이 서로 사용자 계정 정보에 접근할 수 있는 방법을 제공하는 오픈스탠다드 프로토콜입니다. 이는 사용자가 서비스 제공자에게 특정 애플리케이션에 대한 접근 권한을 부여할 수 있게 해줍니다.

 

OAuth2의 주요 장점 중 하나는 사용자가 서비스 제공자와 애플리케이션 사이에서 중개 역할을 할 수 있다는 것입니다. 이는 사용자가 직접적으로 자신의 계정 접근 권한을 제어할 수 있게 해주므로 보안성이 향상됩니다. 또한, 사용자는 비밀번호를 공유하지 않고도 애플리케이션에 의한 자신의 계정 사용을 승인할 수 있습니다.

 

그러나, OAuth2에는 단점도 있습니다. 복잡한 인증 절차로 인해 개발 시간이 늘어날 수 있으며, 애플리케이션에 대한 접근 권한을 부여하는 과정에서 사용자의 실수로 인한 보안 위협이 발생할 수 있습니다. 또한, 서비스 제공자가 변경되거나 중단되는 경우, 이에 따라 애플리케이션의 인증 절차도 변경되어야 하므로 유지 관리 비용이 늘어날 수 있습니다.

 

 

OAuth2 용어 정리

 

📍 리소스 오너 Resource Owner

 

자신의 계정 정보에 대한 제어권을 가지고 있는 사용자(== 서비스를 이용하는 사용자)를 의미합니다. 리소스 소유자는 서비스 제공자와 OAuth를 통해 클라이언트에게 자신의 데이터에 대한 접근 권한을 부여할 수 있습니다.

 

📍 리소스 서버 Resource Server

클라이언트에게 제공하는 리소스를 호스팅하는 서버를 의미합니다. 이는 보통 사용자의 개인정보나 데이터와 같은 정보(== 리소스 오너의 정보)를 가지고 있으며, 클라이언트가 접근 토큰을 통해 요청하면 해당 정보를 제공합니다.

네이버, 구글, 페이스북 (sns 가입서비스)등이 리소스 서버에 해당

 

📍 인증 서버 Authorization Server

클라이언트에게 (리소스 오너의 정보) 접근 토큰을 제공하는 서버를 의미합니다. 클라이언트는 사용자의 승인을 받은 후 인증 서버에게 접근 토큰을 요청하고, 인증 서버는 이를 검증하여 적절한 접근 토큰을 발급합니다. 이 토큰을 통해 클라이언트는 리소스 서버에 접근하여 사용자 정보를 얻을 수 있습니다.

 

📍 클라이언트 애플리케이션 Client Application

사용자가 서비스 제공자에게 정보 접근을 요청하는 대리인입니다. 이는 OAuth 프로토콜을 통해 사용자의 인증 과정을 처리하며, 사용자가 서비스 제공자로부터 인증을 받으면 클라이언트 애플리케이션은 접근 토큰을 받게 됩니다. 이 토큰은 클라이언트 애플리케이션이 사용자를 대신해서 서비스 제공자에게 요청을 보낼 수 있게 하는 열쇠 역할을 합니다. 클라이언트 애플리케이션은 이를 통해 사용자의 정보를 안전하게 접근하고, 사용자의 동의를 받아 서비스 제공자의 리소스를 사용할 수 있습니다.



✨ 클라이언트가 리소스 서버에게 권한을 요청하는 예시 URL

 

<https://www.example.com/oauth/authorize?client_id=CLIENT_ID
&response_type=code
&redirect_uri=REDIRECT_URI
&scope=SCOPE>

이 URL의 각 요소는 다음과 같은 의미를 가집니다:

  • client_id: 클라이언트의 ID입니다.
  • response_type: 응답 유형을 나타냅니다. 이 경우 'code'는 인증 코드를 의미합니다.
  • redirect_uri: 클라이언트의 리디렉션 URI입니다. 이는 인증 후 사용자가 리디렉션될 클라이언트의 URL입니다.
  • scope: 요청하는 권한의 범위입니다. 이는 클라이언트가 어떤 리소스에 접근하려고 하는지를 정의합니다.

 

 

리소스 오너를 취득하는 4가지 방법

 

⭐✔️ 권한 부여 코드 승인 타입 Authorization Code Grant Type

사용자가 클라이언트에게 제공한 코드로 접근 토큰을 받아오는 방식으로, 중요한 보안성을 제공합니다.

 

- 동작 방식:
1. 사용자가 클라이언트 앱에 로그인합니다.
2. 클라이언트 앱은 사용자를 인증 서버로 리디렉션하고, 사용자는 자신의 계정 정보를 입력하고 권한을 부여합니다.
3. 사용자가 인증되면, 인증 서버가 클라이언트에게 인증 코드를 제공합니다.
4. 클라이언트는 받은 인증 코드를 사용하여 인증 서버로 엑세스 토큰을 요청합니다.
5. 인증 서버는 인증 코드를 확인하고 유효하면 엑세스 토큰을 발급합니다.

- 사용 사례: 서버에서 클라이언트로 안전하게 엑세스 토큰을 가져와야 할 때 사용됩니다.

 

✔️ 암시적 승인 타입 Implicit Grant Type

권한 코드 교환 없이 클라이언트에게 바로 접근 토큰을 제공하는 방식으로, 주로 클라이언트 측 JavaScript와 같은 퍼블릭 클라이언트에서 사용됩니다.

 

- 동작 방식:
1. 사용자가 클라이언트 앱에 로그인하면 바로 엑세스 토큰이 발급됩니다.
2. 권한 부여 코드 없이 엑세스 토큰을 바로 받기 때문에, 접근 토큰의 보안 수준이 낮아 보안에 취약할 수 있습니다.

- 사용 사례: 퍼블릭 클라이언트(예: 브라우저 기반 앱)에서 접근 토큰이 보안에 크게 상관없는 경우 사용됩니다.

 

✔️ 리소스 오너 패스워드 자격증명 승인 타입
Resource Owner Password Credentials Grant Type

사용자가 직접 자신의 사용자 이름과 패스워드를 제공하여 접근 토큰을 요청하는 방식이며, 보안에 주의해야 합니다.

 

- 동작 방식:
1. 사용자가 직접 사용자 이름과 패스워드를 클라이언트에게 제공합니다.
2. 클라이언트는 받은 정보로 인증 서버에게 엑세스 토큰을 요청합니다.
3. 사용자의 패스워드가 클라이언트에 노출될 수 있으므로 보안에 주의해야 합니다.

- 사용 사례: 클라이언트가 사용자에게 직접 사용자 이름과 패스워드를 요구해야 할 때 사용됩니다.

 

✔️ 클라이언트 자격증명 승인 타입 Client Credentials Grant Type

사용자 대신 클라이언트가 직접 인증 서버에게 접근 토큰을 요청하는 방식입니다.

 

- 동작 방식:
1. 클라이언트가 자격 증명(클라이언트 ID 및 시크릿)을 사용하여 인증 서버에게 엑세스 토큰을 요청합니다.
2. 사용자가 개입하지 않고, 클라이언트 자격으로 인증 서버에게 접근 토큰을 얻습니다.

- 사용 사례: 서버-서버 간 통신에서 사용되며, 사용자 대화 없이 보호된 리소스에 접근해야 할 때 사용됩니다.



 

🔑 액세스 토큰

 

인증 서버는 사용자의 신원을 확인하고 사용자가 리소스에 접근할 수 있는 권한을 부여하는 서버입니다. 사용자의 인증 정보(예: 사용자 이름, 비밀번호 등)를 확인하고, 올바른 경우 해당 사용자에게 '액세스 토큰'을 제공합니다.

액세스 토큰은 인증 서버가 클라이언트(응용 프로그램 또는 서비스)에게 발급하는 특별한 토큰입니다.
이 토큰은 클라이언트가 보호된 리소스에 접근할 수 있는 권한을 나타내며, 클라이언트가 인증 서버에게 요청할 때마다 리소스에 대한 권한을 증명합니다. 이렇게 함으로써 사용자는 실제로 자신의 사용자 이름과 비밀번호와 같은 인증 정보를 클라이언트에 직접 제공하지 않고도, 클라이언트를 통해 리소스에 접근할 수 있게 됩니다.

즉, 액세스 토큰은 클라이언트가 보호된 리소스에 접근하기 위한 열쇠 같은 역할을 합니다. 이 토큰은 유효 기간이 있어서 일정 시간 동안만 사용할 수 있고, 리소스에 접근할 수 있는 권한을 지닙니다. 그래서 보안 상 유용하며, 사용자의 개인 정보를 안전하게 보호할 수 있게 도와줍니다.


더 쉽게 풀이 하자면 액세스 토큰은 사용자가 직접 자신의 아이디와 비밀번호를 알려주지 않아도, 어떤 서비스나 앱을 사용할 수 있다는 것입니다

예를 들어, 인터넷 쇼핑을 한다고 가정시 사용자가 자신의 아이디와 비밀번호를 직접 온라인 상점에게 알려주지 않고, 그저 쇼핑 앱을 열고 제품을 선택하고 결제하는 것만으로 쇼핑을 할 수 있습니다. 이때 앱은 사용자의 정보를 바탕으로 인터넷 상점에 접속하고, 사용자가 쇼핑을 할 수 있도록 권한을 부여하는 역할을 하는 것이죠. 이렇게 하면 사용자는 아이디와 비밀번호를 직접 입력하지 않아도 편리하게 쇼핑을 할 수 있어요.