OAuth(Open Authorization)는 사용자가 자신의 비밀번호를 직접 제공하지 않고도, 웹이나 앱 서비스가 다른 시스템(예: 구글, 카카오 등)에 저장된 사용자의 데이터에 접근할 수 있도록 권한을 위임하는 인터넷 표준 프로토콜입니다.

우리가 일상적으로 사용하는 "구글로 로그인", "카카오로 로그인"과 같은 소셜 로그인이 바로 이 OAuth 기술을 기반으로 작동합니다. 복잡한 기술적 배경을 직관적으로 이해하실 수 있도록 핵심 구조와 원리를 정리해 드립니다.

1. 쉽게 이해하는 비유: 발렛파킹 (Valet Parking)
호텔에 차를 맡길 때, 우리는 차의 모든 문을 열 수 있는 마스터키 대신 운전만 가능한 '발렛 전용 키'를 건넵니다. 발렛 기사는 차를 주차장으로 이동시킬 수는 있지만, 트렁크나 글로브 박스를 열어 개인 물품을 볼 수는 없습니다.

OAuth에서 발급하는 '접근 토큰(Access Token)'이 바로 이 발렛 키와 같습니다. 서비스가 내 계정의 모든 권한(비밀번호 변경 등)을 갖는 것이 아니라, 서비스 제공에 필요한 '특정 권한(예: 프로필 사진 조회)'만 딱 잘라서 부여하는 것입니다.

2. OAuth의 4가지 핵심 주체 (Roles)
시스템을 설계하고 기획할 때 반드시 이해해야 하는 4가지 역할은 다음과 같습니다.

- Resource Owner (자원 소유자): 일반 사용자입니다. (예: 자신의 구글 계정을 소유한 고객)
- Client (클라이언트): 사용자의 데이터에 접근하여 서비스를 제공하려는 애플리케이션입니다. (예: 우리가 개발 중인 신규 모바일 앱이나 웹 서비스)
- Authorization Server (권한 부여 서버): 사용자의 신원을 확인하고 동의를 얻은 뒤, 클라이언트에게 '접근 토큰'을 발급해 주는 서버입니다. (예: 카카오 인증 서버)
- Resource Server (자원 서버): 사용자의 실제 데이터(프로필, 친구 목록 등)를 보관하고 있으며, 토큰을 확인하고 데이터를 반환하는 서버입니다. (예: 카카오 API 서버)
3. 동작 원리 (Step-by-Step)
가장 보편적으로 사용되는 방식(Authorization Code Grant)을 기준으로 한 흐름입니다.
1. 권한 요청: 클라이언트(앱)가 사용자에게 "카카오 계정의 프로필 정보에 접근해도 될까요?"라고 묻습니다. (로그인 버튼 클릭)

2. 로그인 및 동의: 사용자는 카카오 로그인 페이지로 이동해 ID/PW를 입력하고, 권한 제공에 '동의'합니다.

3. 인증 코드 발급: 카카오는 사용자 동의를 확인한 후, 클라이언트에게 임시 암호인 '인증 코드(Authorization Code)'를 전달합니다.

4. 토큰 교환: 클라이언트는 이 인증 코드를 카카오의 권한 부여 서버(Authorization Server)로 가져가서 실제 사용 가능한 '접근 토큰(Access Token)'으로 교환합니다.

5. 자원 요청 및 제공: 클라이언트는 발급받은 토큰을 제시하며 카카오의 자원 서버(Resource Server)에 프로필 정보를 요청하고, 이를 받아 앱 서비스에 활용합니다.

4. 서비스에 OAuth를 도입하는 주요 목적
- 강력한 보안성: 사용자의 비밀번호를 우리 서비스의 DB에 직접 저장하거나 다룰 필요가 없어 비밀번호 유출 위험을 원천 차단합니다.

- 사용자 경험(UX) 혁신: 번거로운 회원가입 및 정보 입력 절차를 생략할 수 있어, 신규 서비스 진입 장벽을 낮추고 이탈률을 크게 줄일 수 있습니다.
- 권한의 최소화 (Scope): 필요한 권한(예: 이메일 주소 읽기)만 명시적으로 요청하고 제어할 수 있어 데이터 남용을 방지합니다.

'보안' 카테고리의 다른 글
| 세션(Session) 기반 인증과 JWT(JSON Web Token) (0) | 2026.02.22 |
|---|---|
| JWT(JSON Web Token) (0) | 2026.02.22 |
| IPSec (0) | 2025.09.20 |
| 크로스 사이트 요청 위조 (Cross-Site Request Forgery, CSRF) (0) | 2025.09.03 |
| 크로스사이트 스크립팅 - Cross Site Scripting(XSS) (0) | 2025.09.02 |