# JWT와 OAuth 2.0의 원리 - 구글·카카오 1초 간편 로그인은 어떻게 내 정보를 지킬까?

---

## 🔑 들어가며 - 귀찮은 회원가입을 구원한 '카카오 1초 로그인'

새로운 웹사이트나 쇼핑몰에 들어갔을 때,
아이디, 비밀번호, 주민번호 앞자리, 이메일 인증까지 일일이 입력하던 시절을 기억하시나요?
회원가입 창이 너무 길어서 그냥 창을 닫아버린 경험이 다들 한 번쯤 있을 것입니다.

하지만 요즘은 어떤가요?
노란색 **[카카오로 1초 만에 시작하기]** 나 알록달록한 **[Google로 로그인]** 버튼 하나만 누르면,
비밀번호를 입력할 필요도 없이 즉시 로그인이 완료됩니다.

> "내 카카오톡 비밀번호를 이 낯선 쇼핑몰 사이트에 알려주지도 않았는데, 어떻게 쇼핑몰은 내가 누구인지 알고 로그인을 시켜주는 걸까요?"
> "그리고 로그인한 뒤에는 어떻게 페이지를 이동할 때마다 내가 로그인되어 있다는 사실을 기억하는 걸까요?"

현대 웹 보안과 인증 아키텍처의 양대 기둥인 **JWT(JSON Web Token)** 와 **OAuth 2.0** 의 작동 원리를 완벽하게 파헤쳐 보겠습니다.

---

## 🎟️ 1. 전통적인 세션의 한계와 JWT의 탄생

지난 글에서 우리는 데이터베이스에 비밀번호를 안전하게 저장하는 **단방향 해시(Hash)** 기술을 배웠습니다.
비밀번호가 맞아서 로그인에 성공했습니다. 그렇다면 이제 사용자가 페이지를 이동할 때마다 비밀번호를 다시 쳐야 할까요?
당연히 아닙니다.

### 과거의 방식: 세션 (Session) = 사물함 번호표
1. 사용자가 로그인하면, 서버는 컴퓨터 메모리에 사용자 정보를 저장하고 **'세션 ID(번호표)'** 를 발급합니다.
2. 사용자는 브라우저 쿠키에 번호표만 들고 다니며 요청할 때마다 번호표를 보여줍니다.
3. 서버는 번호표를 보고 메모리 사물함을 열어 "아, 홍길동님이구나!" 하고 확인합니다.

```
[ 세션의 치명적인 한계: 서버가 100대로 늘어나면? ]
사용자: "1번 서버에서 발급받은 번호표(세션 ID) 가지고 왔어요!"
2번 서버: "어? 내 메모리엔 그런 번호표 없는데? 다시 로그인하세요!" ➔ 대혼란!
```

서버가 여러 대로 분산되는 현대 클라우드 환경에서는 모든 서버가 공유하는 거대한 세션 저장소(Redis 등)를 따로 유지해야 했고, 서버의 메모리 부담이 극심했습니다.

---

## 🪪 JWT (JSON Web Token) - 스스로를 증명하는 디지털 주민등록증

이 문제를 해결하기 위해 탄생한 것이 바로 **JWT(토큰 기반 인증)** 입니다.

> **세션이 '사물함 번호표'라면, JWT는 구청장의 도장이 찍힌 '진짜 주민등록증'입니다.**

서버는 이제 메모리에 사용자 상태를 전혀 기억하지 않습니다(**Stateless**).
대신 로그인에 성공하면 사용자의 정보(이름, 권한 등)를 적은 뒤, **서버만의 비밀키로 위변조 방지 도장(전자서명)** 을 쾅 찍어서 통째로 사용자에게 건네줍니다.

놀이공원의 자유이용권 손목 띠를 생각해보세요.
직원이 놀이기구 탈 때마다 손님의 이름을 장부에서 일일이 찾지 않습니다.
손목에 감긴 띠의 **위조 방지 홀로그램 도장**만 확인하면 바로 통과시켜 줍니다!

```
┌────────────────────────────────────────────────────────┐
│                   JWT의 3단 구조                        │
│                                                        │
│  [헤더 Header] . [내용 Payload] . [서명 Signature]     │
│                                                        │
│  1. Header    : 토큰의 타입과 암호화 알고리즘 (예: HS256) │
│  2. Payload   : 실제 담긴 사용자 정보 (아이디, 닉네임, 만료일)│
│  3. Signature : 비밀키로 생성한 위변조 검증용 전자도장   │
└────────────────────────────────────────────────────────┘
```

사용자가 위조해서 "나 관리자인데?" 하고 페이로드를 조작하더라도,
서버의 비밀키로 계산한 서명값과 일치하지 않기 때문에 서버는 **"위조된 신분증이다!"** 하고 0.001초 만에 걸러냅니다.

---

## 🏨 2. OAuth 2.0 - 비밀번호를 넘겨주지 않는 발레파킹 열쇠

JWT가 로그인 상태를 유지하는 신분증이라면,
**OAuth 2.0** 은 **"내 진짜 열쇠(비밀번호)를 건네주지 않고 남에게 특정 권한만 빌려주는 기술"** 입니다.

고급 호텔에서 발레파킹을 맡길 때를 떠올려보세요.
우리는 기사님에게 집 열쇠, 금고 열쇠까지 통째로 달린 진짜 마스터 열쇠를 건네지 않습니다.
오직 **'시동만 걸 수 있는 발레파킹 전용 스마트키'** 를 건넵니다.
기사님은 차를 주차할 수는 있지만, 트렁크나 글로브 박스는 열어볼 수 없습니다.

```
[ OAuth 2.0 이전의 끔찍한 방식 ]
낯선 쇼핑몰: "카카오 친구 목록 가져오고 싶으니 카카오 아이디랑 비밀번호 적어주세요."
사용자: "네...? 내 카카오 비밀번호를 당신한테 왜 줘요?!" ➔ 보안 파탄!

[ OAuth 2.0의 우아한 방식 ]
쇼핑몰: "카카오에 인증 요청할 테니 거기서 로그인하고 오세요!"
카카오: "사용자님, 쇼핑몰에 [프로필 사진]과 [이메일]만 넘겨줘도 될까요?" ➔ [동의] 클릭!
카카오 ➔ 쇼핑몰: "비밀번호는 안 주고, 프로필만 볼 수 있는 [임시 출입증(Access Token)] 줄게!"
```

---

## 🔄 OAuth 2.0의 4단계 댄스 (인증 흐름)

카카오 1초 로그인이 일어나는 동안 보이지 않는 곳에서 일어나는 4단계의 마법입니다.

```
👤 사용자                🛍️ 쇼핑몰 (Client)              🟡 카카오 (Auth Server)
   │                              │                                  │
   │── 1. [카카오 로그인] 클릭 ──>│                                  │
   │                              │── 2. 카카오 로그인 창으로 이동 ─>│
   │<────────────────────────────────────────────────────────────────│
   │                                                                 │
   │── 3. 카카오 화면에서 로그인 & 권한 동의 완료! ─────────────────>│
   │                                                                 │
   │<── 4. 임시 인증코드(Code) 들고 쇼핑몰로 복귀 ──────────────────│
   │                                                                 │
   │                              │── 5. 인증코드 줄게, 토큰 다오! ─>│
   │                              │<── 6. [Access Token] 발급! ──────│
   │                              │                                  │
   │                              │── 7. 토큰으로 사용자 프로필 요청 >│
   │                              │<── 8. 이름: 홍길동, 이메일 전달! ─│
   │<── 로그인 성공! 쇼핑 시작! ──│                                  │
```

1. 사용자는 오직 **공식 카카오 서버의 안전한 페이지**에서만 비밀번호를 입력합니다.
2. 쇼핑몰은 사용자의 비밀번호를 눈곱만큼도 알 수 없습니다.
3. 쇼핑몰이 손에 쥐는 것은 오직 카카오가 발급해 준 **'특정 기간 동안만 유효한 임시 출입증(Access Token)'** 뿐입니다.
4. 만약 쇼핑몰이 해킹당하더라도, 내 카카오 계정 비밀번호는 100% 안전합니다!

---

## 🎯 한 줄 요약 및 다음 예고

> **JWT가 서버 메모리 부담 없이 안전하게 상태를 증명하는 '디지털 자유이용권'이라면, OAuth 2.0은 내 비밀번호를 노출하지 않고 안전하게 제3자에게 권한을 위임하는 현대 웹의 '발레파킹 스마트키'입니다.**

웹 애플리케이션의 인증과 데이터 파이프라인이 완벽한 보안 속에 완성되었습니다.
그렇다면 이제 이 방대한 데이터 속에서 **기계는 어떻게 인간의 지능을 흉내 내어 스스로 학습하고 추론하는 인공지능(AI)을 구축할 수 있을까요?**

다음 글에서는 AI, 머신러닝 & 빅데이터 시리즈 2탄, **"인공신경망(ANN)과 딥러닝 - 기계는 어떻게 인간의 뇌처럼 생각하게 되었을까?"** 편으로 이어집니다!

 

+ Recent posts