본문 바로가기
Springboot Study/Springboot Security

OAuth

by xogns93 2024. 10. 28.

OAuth는 인증(누구인지 확인)보다는 권한 부여(무엇을 할 수 있는지 확인)에 중점을 둔 프로토콜입니다. 사용자의 비밀번호를 공유하지 않으면서도 제3의 애플리케이션이 특정한 사용자 데이터를 안전하게 접근할 수 있도록 설계된 것이 특징입니다.

 

OAuth의 주요 개념

  1. 리소스 소유자(Resource Owner): 사용자를 의미하며, 보호된 자원(예: 이메일, 프로필 정보 등)을 소유하고 있는 사람입니다.
  2. 클라이언트(Client): 사용자 데이터를 이용하고자 하는 제3의 애플리케이션입니다. 예를 들어, 사용자의 구글 프로필 정보에 접근하고자 하는 뉴스 앱이 클라이언트 역할을 합니다.
  3. 권한 부여 서버(Authorization Server): 사용자를 인증하고 클라이언트에 액세스 토큰을 발급하는 서버입니다. 이 서버는 일반적으로 사용자가 소속된 서비스(예: 구글, 페이스북 등)에 속해 있어요.
  4. 리소스 서버(Resource Server): 보호된 자원이 저장된 서버입니다. 클라이언트는 권한 부여 서버에서 발급받은 액세스 토큰을 사용해 리소스 서버에 접근합니다.
  5. 액세스 토큰(Access Token): 클라이언트가 리소스 서버에 접근할 수 있도록 발급된 일종의 키입니다. 이 토큰은 특정한 범위(scope)와 유효 기간을 가지며, 이를 통해 사용자 비밀번호 없이도 안전한 데이터 접근을 보장합니다.

 

OAuth의 동작 과정

OAuth는 권한 부여 코드 승인 방식을 사용하여 클라이언트가 액세스 토큰을 받는 과정을 거쳐요. 일반적인 절차는 다음과 같아요:

  1. 클라이언트 권한 요청:
    • 클라이언트 애플리케이션은 리소스 소유자(사용자)에게 특정 자원에 접근할 수 있는 권한을 요청해요.
    • 사용자는 권한 부여 서버(예: 구글 로그인 페이지)를 통해 권한 요청을 승인할지 여부를 확인하게 됩니다.
  2. 사용자 인증 및 권한 부여:
    • 권한 부여 서버는 사용자에게 로그인과 인증 과정을 거치게 해요.
    • 사용자가 로그인하고 권한 요청을 승인하면, 권한 부여 서버는 **권한 부여 코드(Authorization Code)**를 클라이언트에 전달합니다.
  3. 액세스 토큰 교환:
    • 클라이언트는 받은 권한 부여 코드를 사용해 권한 부여 서버에 액세스 토큰 발급을 요청합니다.
    • 권한 부여 서버는 이 요청을 검증한 후 클라이언트에게 액세스 토큰을 발급해요.
  4. 리소스 서버 접근:
    • 클라이언트는 발급받은 액세스 토큰을 사용해 리소스 서버에 요청을 보냅니다.
    • 리소스 서버는 토큰의 유효성을 검증하고, 유효한 토큰이면 보호된 자원을 클라이언트에 제공해요.
  5. 데이터 접근 종료:
    • 액세스 토큰은 유효 기간이 지나면 만료되고, 더 이상 사용이 불가능해요.
    • 클라이언트가 자원 접근을 지속적으로 원할 경우 새로운 액세스 토큰을 발급받아야 합니다.

 

 

OAuth의 활용 예시

예시 1: 제3의 애플리케이션에서 SNS 로그인

예를 들어, 한 뉴스 웹사이트가 사용자가 구글 계정으로 로그인하도록 허용한다고 가정해볼게요.

  1. 사용자가 뉴스 웹사이트에서 구글 로그인을 선택합니다.
  2. 뉴스 웹사이트(클라이언트)는 사용자를 구글의 로그인 페이지로 리디렉션합니다.
  3. 사용자는 구글 로그인 페이지에서 자신의 계정 정보를 입력하고 로그인합니다.
  4. 구글은 사용자가 뉴스 웹사이트에 자신의 프로필 정보에 접근하는 것을 허용할지 여부를 묻습니다.
  5. 사용자가 허용하면, 구글은 뉴스 웹사이트에 권한 부여 코드와 함께 사용자의 프로필 정보에 접근할 수 있는 액세스 토큰을 발급합니다.
  6. 뉴스 웹사이트는 이 액세스 토큰을 사용하여 사용자의 이름, 이메일 등의 기본 정보를 구글 API를 통해 받아옵니다.

이 과정에서 뉴스 웹사이트는 사용자 비밀번호를 알 필요가 없으며, 구글에서 발급한 액세스 토큰을 통해 필요한 데이터만 안전하게 접근할 수 있습니다.

예시 2: 피트니스 앱과 구글 피트 데이터 연동

피트니스 앱이 사용자의 구글 피트 데이터를 가져와 운동 기록을 분석한다고 가정해요.

  1. 피트니스 앱은 사용자가 구글 계정으로 운동 기록에 접근할 수 있는 권한을 요청합니다.
  2. 사용자가 구글 로그인 페이지에서 로그인하고, 피트니스 앱이 운동 기록에 접근할 수 있는 것을 허용합니다.
  3. 구글은 피트니스 앱에 운동 기록 접근 권한이 포함된 액세스 토큰을 발급합니다.
  4. 피트니스 앱은 이 토큰을 사용해 사용자의 운동 기록을 구글 API에서 받아와 분석합니다.

 

 

OAuth의 장점과 단점

장점

  • 보안성 강화: 사용자의 비밀번호나 민감 정보를 공유하지 않고도 접근 권한을 부여할 수 있어 보안이 강화됩니다.
  • 사용 편의성: 다양한 애플리케이션과 서비스 간에 인증 연동을 쉽게 할 수 있으며, 사용자 입장에서는 하나의 계정으로 다양한 애플리케이션에 접근할 수 있습니다.
  • 접근 제어: 사용자 동의를 통해 필요한 데이터에만 접근하도록 제한할 수 있습니다. 예를 들어, 구글 프로필 정보에만 접근할 수 있도록 특정 범위를 설정할 수 있습니다.

단점

  • 구현 복잡성: OAuth는 설정 과정이 복잡하며, 권한 부여 서버와 클라이언트 간의 협력이 필요하기 때문에 개발과정에서 구현이 까다롭습니다.
  • 보안상의 위협: 잘못된 설정이나 보안 허점이 있을 경우, 토큰 탈취나 사용자 데이터의 노출 가능성이 존재합니다. 특히 만료되지 않은 토큰을 탈취당할 경우 사용자의 데이터가 외부에 유출될 위험이 있습니다.

 

 

결론

OAuth는 사용자 비밀번호를 제3의 애플리케이션과 공유하지 않으면서도 필요한 데이터에 안전하게 접근할 수 있도록 권한을 부여하는 강력한 프로토콜이에요. 사용자의 동의를 통해 필요한 데이터에만 접근할 수 있도록 제한하고, 토큰을 통해 세밀하게 접근을 제어할 수 있어 보안성과 접근 편의성을 동시에 확보할 수 있습니다.