OAuth 2.0 동작 원리: 소셜 로그인 구현 전 알아야 할 4가지 역할과 Grant Type

📌 핵심 요약

  • OAuth 2.0은 "비밀번호를 공유하지 않고 권한만 위임"하는 프로토콜입니다.
  • 참여자 4대장: Resource Owner, Client, Authorization Server, Resource Server
  • 보안의 핵심: 프론트엔드가 아닌 백엔드에서 토큰을 교환하는 Authorization Code Grant 방식 상세 분석

과거에는 내 앱이 사용자의 구글 주소록을 가져오려면, 사용자에게 "구글 ID랑 비밀번호 좀 알려줘"라고 요구했습니다. 보안상 미친 짓이죠. 내 앱이 해킹당하면 사용자의 구글 계정도 털리기 때문입니다.

이 문제를 해결하기 위해 등장한 것이 OAuth (Open Authorization)입니다. 쉽게 말해 "호텔 발렛파킹 키"와 같습니다. 발렛 직원(내 앱)에게 내 차(데이터)를 맡길 때, 마스터키(비밀번호)가 아닌 시동과 문 열기만 가능한 발렛 전용 키(Access Token)를 주는 것입니다.

OAuth 2.0 권한 코드 흐름

1. OAuth 2.0의 4가지 역할 (Roles)

문서를 읽을 때 이 용어들이 헷갈리면 이해가 불가능합니다. 딱 정리해 드립니다.

용어 설명 예시
Resource Owner 정보 주인 (사용자) 로그인하려는 사람
Client 정보를 쓰고 싶은 앱 우리가 개발하는 서비스
Authorization Server 인증 담당 서버 구글/카카오 로그인 서버
Resource Server 데이터 저장소 구글/카카오 API 서버

2. 가장 안전한 방식: Authorization Code Grant

OAuth에는 여러 방식이 있지만, 보안상 가장 안전하고 표준으로 쓰이는 방식은 Authorization Code Grant입니다. 핵심은 "중요한 토큰은 브라우저(Front)에 노출하지 않고 서버(Back)끼리만 주고받는다"는 것입니다.

Step 1. "로그인하러 가기" (Client → Auth Server)

사용자가 '구글 로그인' 버튼을 누르면, 우리 앱은 사용자를 구글 로그인 페이지로 이동시킵니다. 이때 client_id, redirect_uri, scope(요청 권한), response_type=code를 파라미터로 보냅니다.

Step 2. "인증 완료 & 코드 발급" (Auth Server → Client)

사용자가 구글에 로그인을 성공하고 "정보 제공에 동의"를 누르면, 구글은 사전에 약속된 redirect_uri로 사용자를 돌려보냅니다. 이때 URL 뒤에 임시 인증 코드(Authorization Code)를 붙여서 보냅니다.
https://myapp.com/callback?code=abc1234...

💡 중요:code는 Access Token이 아닙니다. "토큰으로 바꿀 수 있는 교환권"일 뿐입니다. 해커가 이걸 훔쳐도 client_secret을 모르면 토큰으로 못 바꿉니다.

Step 3. "토큰 교환" (Client Backend ↔ Auth Server)

이제 우리 앱의 백엔드 서버가 나섭니다. 브라우저로부터 받은 code와 서버에 숨겨둔 client_secret을 합쳐서 구글 서버에 직접 요청(Back-channel)을 보냅니다.
"구글아, 아까 받은 코드가 이건데, 내 비밀키랑 같이 줄게. 진짜 토큰 줘."

Step 4. Access Token 발급 완료

구글이 확인 후 유효하다면, 드디어 Access Token(과 Refresh Token)을 우리 서버에 발급해 줍니다. 이제 우리 서버는 이 토큰을 이용해 구글 API에서 사용자 정보를 가져올 수 있습니다.

3. 왜 Implicit Grant는 쓰지 않나요?

과거에는 SPA(Single Page App)에서 백엔드를 거치지 않고 바로 토큰을 받는 Implicit Grant 방식을 쓰기도 했습니다. 하지만 URL 해시(#)에 토큰이 노출되어 보안에 매우 취약합니다.

현재는 SPA에서도 PKCE (Proof Key for Code Exchange)가 적용된 Authorization Code Grant 방식을 사용하는 것이 표준 권장 사항입니다.

4. 결론

OAuth 2.0 구현 시 "Access Token은 절대 브라우저 URL에 노출되면 안 된다"는 원칙만 기억하십시오.

프론트엔드는 Code만 받아오고, 실제 토큰 교환은 백엔드가 수행해야 합니다. 이것이 소셜 로그인의 보안을 지키는 가장 확실한 아키텍처입니다.

이 블로그의 인기 게시물

Docker 컨테이너 'Connection Refused' (Errno 111) 오류 해결 가이드

Redis 캐싱 전략 완벽 가이드: Look Aside부터 Write Back까지 (DB 부하 줄이기)

브라우저 렌더링 원리: Reflow와 Repaint 최적화 가이드 (CRP 심층 분석)