800===Dev Docs and License/Web Security

OAuth 2.0 - 현대적 접근 권한 관리의 핵심 🔐

블로글러 2025. 3. 27. 07:36

안녕하세요! 오늘은 현대 웹 서비스에서 빼놓을 수 없는 인증 프로토콜인 OAuth 2.0에 대해 알아볼게요. 

OAuth 2.0은 마치 호텔의 키 카드 시스템과 비슷해요. 호텔에 체크인하면 신분증을 확인한 후 특정 방에만 들어갈 수 있는 키 카드를 줍니다. 마찬가지로 OAuth는 사용자의 신원을 확인한 후, 필요한 권한만 가진 '키'(토큰)를 제공하는 시스템이에요.

등장 배경

과거에는 어떻게 했을까요? 🕰️

예전에는 외부 서비스를 이용하기 위해 직접 아이디와 비밀번호를 제공해야 했어요. 마치 친구 집에 들어가기 위해 집 열쇠 전체를 빌리는 것과 같았죠! 이런 방식은 안전할까요? 당연히 아니죠!

  1. 보안 위험: 제3자 앱에 비밀번호 노출
  2. 과도한 권한: 모든 접근 권한을 제공
  3. 변경 문제: 비밀번호 변경 시 모든 연동 앱 업데이트 필요

이러한 문제를 해결하기 위해 OAuth 1.0이 2007년에 등장했고, 2012년 더 단순하고 확장성 있는 OAuth 2.0으로 발전했어요.

OAuth 2.0이 해결하는 문제점:

  1. 안전한 인증: 비밀번호 공유 없이도 인증 가능 😎
  2. 권한 세분화: 필요한 권한만 부여 가능 👍
  3. 사용자 경험: 간편한 로그인으로 편의성 향상 ✨

핵심 원리

OAuth 2.0은 네 가지 주요 역할자가 있어요:

1. 주요 역할자

1. 리소스 소유자(Resource Owner): 데이터의 실제 주인(사용자)
2. 클라이언트(Client): 접근을 요청하는 앱/서비스
3. 권한 부여 서버(Authorization Server): 인증/권한 부여 담당
4. 리소스 서버(Resource Server): 보호된 데이터 보유

2. 권한 부여 방식(Grant Types)

가장 일반적인 Authorization Code Flow를 살펴볼까요?

+--------+                               +---------------+
|        |--(A)-- 인증 요청 ---------->|               |
|        |                               | 권한 부여 서버 |
|        |<-(B)-- 인증 코드 ------------|               |
|        |                               +---------------+
| 클라이언트 |
|        |                               +---------------+
|        |--(C)-- 인증 코드로 토큰 요청->|               |
|        |                               | 리소스 서버    |
|        |<-(D)-- 접근 토큰 ------------|               |
+--------+                               +---------------+

이외에도 더 간단한 Implicit Grant, 서버간 통신을 위한 Client Credentials Grant, 높은 신뢰 앱을 위한 Password Grant 등이 있어요.

3. 토큰 종류

* Access Token: 실제 접근에 사용 (수명이 짧음)
* Refresh Token: 토큰 갱신에 사용 (수명이 김)
* ID Token: 사용자 정보를 담음 (OpenID Connect)

사례 소개

실제로 우리 일상에서 OAuth 2.0은 어디에 쓰일까요? 🌏

  1. 소셜 로그인: 구글, 페이스북, 깃허브 계정으로 로그인
  2. API 접근: Spotify 플레이리스트 관리, Trello 작업 자동화
  3. 엔터프라이즈 환경: 사내 시스템 통합 인증 (SSO)

Spring Boot에서의 구현 예시:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/login**").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }
}

Node.js에서의 구현 예시:

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "/auth/google/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    // 사용자 정보 처리
    return done(null, profile);
  }
));

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 토큰 관리
    • Access Token은 항상 안전하게 저장 (localStorage 사용 지양)
    • HTTPS 사용은 필수!
    • 토큰 만료 시간 적절히 설정 (보통 1시간 이내)
  2. CSRF 공격 방지
    • 요청마다 고유한 state 파라미터 사용
    • 콜백에서 state 값 검증
  3. 리디렉션 URI 검증
    • 등록된 URI만 허용하도록 설정
    • 와일드카드(*) 사용은 피하기

💡 꿀팁

  • PKCE(Proof Key for Code Exchange) 확장을 사용하면 코드 가로채기 공격을 방지할 수 있어요
  • 모바일 앱은 Custom URL Scheme 또는 Universal Links 사용하기
  • 토큰 갱신 로직은 자동화해서 사용자 경험 향상시키기
  • OAuth 2.0만으로는 인증이 아닌 권한 부여만 제공, 사용자 정보가 필요하다면 OpenID Connect 추가하기

장단점 비교

장점 👍

  • 사용자 비밀번호 노출 없는 안전한 인증
  • 권한 세분화로 보안 강화
  • 표준화된 프로토콜로 다양한 서비스와 호환
  • 사용자 경험 개선

단점 👎

  • 구현 복잡성
  • 잘못 구현 시 보안 취약점 발생 가능
  • 추가 통신으로 인한 성능 부담
  • 토큰 관리 로직 필요

마치며

지금까지 OAuth 2.0에 대해 알아보았습니다. 처음에는 복잡하게 느껴질 수 있지만, 이해하고 나면 현대 웹 서비스의 안전한 인증과 권한 관리에 필수적인 기술임을 알 수 있을 거예요! 😊

참고 자료 🔖


#OAuth #인증 #보안 #웹개발 #API

728x90