800===Dev Concepts and License/Authorization

OAuth 2.0 - 안전한 인증과 권한 부여의 표준 프로토콜 🔐

블로글러 2025. 5. 30. 08:05

소셜 로그인을 해본 적이 있으신가요? "구글로 로그인", "카카오로 로그인" 같은 버튼을 클릭하면 별도의 회원가입 없이도 서비스를 이용할 수 있죠. 이게 바로 OAuth 2.0이 작동하는 모습입니다! 🚀

등장 배경

예전에는 어떤 서비스가 다른 서비스의 데이터에 접근하려면 사용자의 아이디와 비밀번호를 직접 받아서 저장해야 했습니다. 예를 들어, 캘린더 앱이 Gmail 연락처를 가져오려면 Gmail 비밀번호를 요구했죠. 😱

OAuth가 해결하는 문제점:

  1. 비밀번호 노출 위험: 제3자 서비스에 직접 비밀번호를 제공하면 해킹 위험이 증가
  2. 권한 제어 불가: 모든 권한을 넘겨줄 수밖에 없어 세밀한 제어가 불가능
  3. 비밀번호 변경 시 문제: 원본 서비스에서 비밀번호를 변경하면 연동된 모든 서비스가 작동 중단

핵심 원리

OAuth 2.0은 마치 호텔 키카드 시스템과 같습니다. 🏨 호텔에서 체크인하면 마스터키 대신 특정 방과 시설만 이용할 수 있는 키카드를 받죠. OAuth도 비슷하게 작동합니다!

주요 구성 요소

구성 요소 설명 실제 예시
Resource Owner 자원의 소유자 (사용자) 당신! 👤
Client 자원에 접근하려는 애플리케이션 네이버 캘린더 앱
Authorization Server 인증과 권한 부여를 담당 Google 인증 서버
Resource Server 보호된 자원을 가지고 있는 서버 Gmail API 서버

OAuth 2.0 플로우 시각화

┌─────────────┐                                  ┌──────────────┐
│             │                                  │              │
│   사용자     ├─────(1) 로그인 요청──────────────►│    클라이언트  │
│             │                                  │   (앱/웹)     │
└──────┬──────┘                                  └──────┬───────┘
       │                                                │
       │                                                │
       │  ┌───────(2) 인증 페이지로 리다이렉트───────────┘
       │  │
       ▼  ▼                                      ┌──────────────┐
┌─────────────┐                                  │              │
│             │◄────(3) 로그인 & 권한 허가─────────│ Authorization│
│  브라우저    │                                  │    Server    │
│             ├────(4) Authorization Code───────►│   (Google)   │
└─────────────┘                                  └──────┬───────┘
                                                        │
       ┌────────────────────────────────────────────────┘
       │
       ▼                                         ┌──────────────┐
┌─────────────┐                                  │              │
│             │◄────(5) Access Token─────────────│   Resource   │
│  클라이언트   │                                  │    Server    │
│             ├────(6) API 요청 + Token─────────►│   (Gmail)    │
└─────────────┘                                  └──────────────┘

주요 Grant Types (인증 방식)### 주요 Grant Types 비교

Grant Type 사용 시나리오 보안 수준 특징
Authorization Code 웹 애플리케이션, 모바일 앱 ⭐⭐⭐⭐⭐ 가장 안전하고 널리 사용됨
PKCE 공개 클라이언트 (SPA, 모바일) ⭐⭐⭐⭐⭐ Authorization Code의 보안 강화 버전
Client Credentials 서버 간 통신 ⭐⭐⭐⭐ 사용자 개입 없이 작동
Resource Owner Password 매우 신뢰할 수 있는 1st party 앱 ⭐⭐ 권장하지 않음
Implicit SPA (구식 방법) 더 이상 사용 권장하지 않음

주의사항 및 팁 💡⚠️ 이것만은 주의하세요!

  1. Implicit Grant 사용 금지 🚫
    • 2025년 최신 보안 권고사항에서는 Implicit Grant 사용을 금지합니다
    • 대신 PKCE를 적용한 Authorization Code Flow를 사용하세요
  2. HTTPS 필수 사용 🔒
    • 모든 OAuth 통신은 반드시 HTTPS를 사용해야 합니다
    • 개발 환경에서만 예외적으로 HTTP를 허용할 수 있습니다
  3. Redirect URI 정확한 검증 🎯
    • 정확한 문자열 매칭으로 검증해야 합니다
    • 와일드카드나 부분 매칭은 보안 취약점이 될 수 있습니다
  4. 토큰 관리 주의사항 🔑
    • Access Token: 짧은 수명 (15-60분)
    • Refresh Token: 안전하게 저장하고 주기적으로 갱신
    • 절대 토큰을 URL이나 로그에 노출하지 마세요

💡 꿀팁

  • PKCE 적용하기: 모든 공개 클라이언트(SPA, 모바일 앱)는 PKCE를 사용하세요
  • Scope 최소화: 필요한 최소한의 권한만 요청하세요
  • 점진적 인증: 사용자가 기능을 사용할 때 필요한 권한을 요청하세요
  • State 파라미터 활용: CSRF 공격을 방지하기 위해 state 파라미터를 사용하세요

마치며

지금까지 OAuth 2.0에 대해 알아보았습니다. 처음에는 복잡해 보일 수 있지만, 결국 "안전한 권한 위임"이라는 핵심 목적을 달성하기 위한 프로토콜입니다.

OAuth 2.0은 현재 업계 표준이며, 2025년 기준으로 OAuth 2.1이 개발 중입니다. OAuth 2.1은 보안 모범 사례를 필수 사항으로 만들어 더욱 안전한 인증 환경을 제공할 예정입니다.

이 글이 OAuth 2.0을 이해하는 데 도움이 되었길 바랍니다! 🎉

참고 자료 🔖


#OAuth2 #인증 #보안 #WebDevelopment

728x90
반응형