OAuth 2.0이 무엇이고, 어떤 상황에서 사용하나요? 기본적인 동작 방식도 설명해주세요.
OAuth를 이해하려면 먼저
인증(Authentication) 과 인가(Authorization) 의 차이를 알아야 한다.
| 구분 | 설명 |
|---|---|
| Authentication(인증) | "너 누구야?"를 확인하는 과정 |
| Authorization(인가) | "너 무엇을 할 수 있어?"를 결정하는 과정 |
예를 들어
아이디와 비밀번호를 입력하여 로그인하는 것은
인증(Authentication) 이다.
아이디
↓
비밀번호
↓
로그인 성공
OAuth(Open Authorization)는
비밀번호를 공유하지 않고 다른 서비스에게 권한을 위임하는 표준 프로토콜이다.
많은 사람들이
"OAuth = 소셜 로그인"
이라고 생각하지만
정확한 표현은 아니다.
OAuth의 목적은
로그인이 아니라
권한 위임(Authorization Delegation) 이다.
소셜 로그인은 OAuth를 활용한 대표적인 사례일 뿐이다.
예를 들어 내가 쇼핑몰 서비스를 만들었다고 가정하자.
사용자가
구글 로그인
을 원한다.
가장 단순한 방법은
우리 서버
↓
구글 아이디
↓
구글 비밀번호 입력
이다.
하지만
이 방법은 매우 위험하다.
왜냐하면
우리 서버가
사용자의
구글 비밀번호를 알게 되기 때문이다.
OAuth는
비밀번호는 절대 공유하지 말고 권한만 위임하자.
라는 개념이다.
즉
사용자
↓
구글 로그인 클릭
↓
구글 로그인 화면
↓
사용자가 직접 로그인
↓
구글이 Access Token 발급
↓
우리 서비스
우리 서버는
구글 비밀번호를 절대 알지 못한다.
오직
Access Token만 전달받는다.
OAuth가 없다면
친구에게
우리 집 비밀번호
1234
를 알려주는 것과 같다.
친구는
모든 것을 열 수 있다.
매우 위험하다.
OAuth는
비밀번호 대신
출입카드를 발급하는 것이다.
출입카드
↓
현관 출입 가능
↓
금고는 접근 불가
↓
하루만 사용 가능
즉
비밀번호가 아니라
권한만 전달하는 것이다.
OAuth에서는
사용자 인증이 완료되면
Authorization Server가
Access Token을 발급한다.
예를 들어
abc123xyz
와 같은 문자열이다.
우리 서버는
이 토큰을 이용하여
구글 API를 호출한다.
Authorization
Bearer abc123xyz
구글은
토큰을 확인한 뒤
사용자 정보를 반환한다.
OAuth는 크게 네 가지 구성 요소로 이루어진다.
사용자
예를 들어
나
이다.
OAuth를 사용하는 서비스
예를 들어
우리 쇼핑몰
우리 서비스
이다.
사용자를 인증하고
Access Token을 발급하는 서버이다.
대표적으로
로그인 서버가 여기에 해당한다.
실제 사용자 정보를 가지고 있는 서버이다.
예를 들어
Google의
userinfo API
가 여기에 해당한다.
① 사용자가
구글 로그인
버튼을 클릭한다.
↓
② 우리 서비스는
사용자를
구글 로그인 페이지로 이동시킨다.
↓
③ 사용자가
구글에서 직접 로그인한다.
↓
④ 구글은
Access Token을 발급한다.
↓
⑤ 우리 서버는
Access Token을 이용하여
사용자 정보를 요청한다.
↓
⑥ 구글은
이름
이메일
프로필 사진 등을 반환한다.
↓
⑦ 우리 서비스는
회원가입 또는 로그인을 완료한다.
전체 흐름은 다음과 같다.
사용자
↓
구글 로그인
↓
구글 인증
↓
Access Token 발급
↓
우리 서버
↓
사용자 정보 조회
↓
로그인 완료
대표적으로
모두 OAuth 2.0을 사용한다.
또는
Notion이
Google Drive에 접근하거나
Slack이 Google Calendar를 조회하는 경우처럼
다른 서비스의 데이터를 사용할 때도
OAuth를 사용한다.
면접에서 자주 나오는 질문이다.
많은 사람들이
OAuth = JWT
라고 생각하지만
둘은 완전히 다른 개념이다.
| OAuth | JWT |
|---|---|
| 권한을 위임하는 프로토콜 | 토큰의 형식 |
| 인증 절차를 정의 | 데이터를 담는 방법 |
| Google Login 등에서 사용 | 로그인 후 자체 인증 토큰으로 많이 사용 |
즉
OAuth가
JWT를 사용할 수도 있고
사용하지 않을 수도 있다.
Spring에서는
http
.oauth2Login();
만 설정하면
Spring Security가
과정을 대부분 자동으로 처리한다.
개발자는
OAuth2UserService 등을 구현하여
회원가입 및 로그인 로직만 작성하면 된다.
| 항목 | 설명 |
|---|---|
| OAuth | 비밀번호를 공유하지 않고 권한을 위임하는 프로토콜 |
| Authentication | 사용자 인증(로그인) |
| Authorization | 권한 부여 |
| Access Token | 권한을 증명하는 토큰 |
| 대표 사례 | 구글 로그인, 카카오 로그인, Github 로그인 |
OAuth 2.0은 사용자의 비밀번호를 직접 공유하지 않고, 다른 서비스에 권한을 위임하기 위한 표준 프로토콜입니다. 대표적으로 구글, 카카오, 네이버 로그인 등에 사용됩니다. 사용자가 OAuth 제공자의 로그인 화면에서 인증을 완료하면 Authorization Server가 Access Token을 발급하고, 클라이언트는 해당 토큰으로 Resource Server에 사용자 정보를 요청합니다. 이를 통해 비밀번호를 알지 못한 채 필요한 권한만 안전하게 사용할 수 있습니다.
| OAuth 1.0 | OAuth 2.0 |
|---|---|
| Signature 기반 인증 | Access Token 기반 인증 |
| 구현이 복잡 | 구현이 단순 |
| 현재 거의 사용하지 않음 | 현재 표준 |
| 매 요청마다 서명 생성 | Bearer Token 사용 |
OAuth 1.0은 Signature 기반이라 구현이 복잡했다.
OAuth 2.0은 Access Token(Bearer Token) 기반으로 단순화되었다.
현재 실무에서는 거의 모두 OAuth 2.0을 사용한다.
실제 소셜 로그인은 OAuth 2.0만 사용하는 것이 아니라, 사용자 인증을 위해 OpenID Connect(OIDC)를 함께 사용하는 경우가 많다.