비밀번호를 알려주지 않아도 로그인할 수 있는 이유?
그 중심에는 OAuth2.0과 JWT가 있음.
이번 포스팅에서는 소셜 로그인에서 많이 사용되는 인증 방식인 OAuth2.0, Access Token, JWT에 대해 정리함.
OAuth(Open Authorization) 는 말 그대로 “허가를 위임한다”는 뜻입니다.
예시로 이해하기
즉, “카카오, 이 사용자 인증해줘!” 라고 우리 서비스가 카카오에게 인증을 위임하는 구조입니다.
OAuth는 1.0 → 2.0으로 발전하며 사용성과 보안성이 개선되었습니다.
| 항목 | 설명 |
|---|---|
| 🔐 HTTPS 기반 | 인증 요청은 암호화된 HTTPS 통신으로 진행 |
| 🔗 인증 서버 분리 | 인증 서버와 리소스(데이터) 서버를 분리하여 구조 분담 |
| 🎯 확장성 | 다양한 서비스(구글, 카카오 등)에서 유연하게 사용 가능 |
[1] 사용자가 "카카오로 로그인" 클릭
↓
[2] 브라우저가 카카오 인증 서버로 이동
↓
[3] 카카오 로그인 화면에서 ID/비번 입력 & 동의
↓
[4] 카카오가 Access Token 발급해서 우리 서비스에 전달
↓
[5] 우리 서비스가 Access Token으로 사용자 정보 요청
↓
[6] 카카오가 사용자 정보 + (JWT) 응답
↓
[7] 우리 서비스는 로그인 처리 + JWT 토큰을 클라이언트에 저장
Header.Payload.Signature) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiJKdW5na3kifQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header.Payload.Signature
└────┘ └─────┘ └──────┘
alg+typ 사용자정보 서명(위조방지)
| 파트 | 설명 | 예시 내용 |
|---|---|---|
| Header | 토큰의 타입과 알고리즘 | { "alg": "HS256", "typ": "JWT" } |
| Payload | 사용자 정보 (Claims) | { "user_id": 123, "name": "Jungky" } |
| Signature | 위조 방지용 서명 | 암호화된 문자열 |
| 개념 | 역할 | 예시 |
|---|---|---|
| OAuth 2.0 | 인증을 "위임"하는 표준 | 카카오로 로그인 |
| Access Token | 인증 결과로 받는 "열쇠" | API 요청 시 헤더에 포함 |
| JWT | 사용자 정보가 담긴 "스마트 토큰" | Authorization: Bearer <토큰> |
[사용자] ⇄ [카카오 인증 서버]
↓ (로그인 위임 요청)
[우리 서버] ← Access Token 발급
↓
[우리 서버] → 사용자 정보 요청
↓
[우리 서버] ← 사용자 정보 + (JWT 응답)
↓
[우리 서비스] → 로그인 처리 완료