๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

35์ผ์ฐจ. ์นด์นด์˜ค OAuth๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž

by GreenJin_S2 2025. 11. 26.

 

๐Ÿ˜Ž๐Ÿ˜Ž๐Ÿ˜Ž๐Ÿ˜Ž๐Ÿ˜Ž๐Ÿ˜Ž ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์„ฑ๊ณต {success=true, message=์นด์นด์˜ค ๋กœ๊ทธ์ธ ์„ฑ๊ณต, user={id=kakao_user_123, email=user@example.com, name=ํ…Œ์ŠคํŠธ ์‚ฌ์šฉ์ž}, token=mock-jwt-token-1764119336031} ์ง€๊ธˆ์€ ๋”๋ฏธ๊ฐ’์œผ๋กœ ๋ฌด์กฐ๊ฑด ์„ฑ๊ณต ์‹œ์ผฐ์ง€๋งŒ , ์ด์ œ๋Š” ์นด์นด์˜ค์—์„œ ์ธ์ฆ์„ ํ•˜๊ณ  ์‹ถ์–ด. ํ˜„์žฌ env ํŒŒ์ผ์—๋Š” KAKAO_REST_API_KEY, KAKAO_ADMIN_KEY, KAKAO_REDIRECT_URI ์ด ๋“ฑ๋ก๋˜์–ด ์—ˆ์–ด. ์ธ์ฆ์— ํ•„์š”ํ•œ ๊ฐ’์ด ๋” ์žˆ๋Š”์ง€์™€ ์นด์นด์˜ค ์ธ์ฆ์„ ํ•˜๊ธฐ์œ„ํ•œ ์ „๋žต์„ ์ œ์•ˆํ•ด์ค˜.

 

 

์ข‹์Šต๋‹ˆ๋‹ค! ์‹ค์ œ ์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ์ œ์•ˆ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

## ๐Ÿ“‹ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ์ „๋žต

### 1๏ธโƒฃ **ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜**

ํ˜„์žฌ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
- โœ… `KAKAO_REST_API_KEY` - ์นด์นด์˜ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ REST API ํ‚ค
- โœ… `KAKAO_REDIRECT_URI` - ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ ์ฝœ๋ฐฑ URI (์˜ˆ: `http://localhost:8080/api/auth/kakao/callback`)
- โš ๏ธ `KAKAO_ADMIN_KEY` - ์„ ํƒ์‚ฌํ•ญ (๊ด€๋ฆฌ์ž API์šฉ, ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ์—๋Š” ๋ถˆํ•„์š”)

**์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜:**
- ๐Ÿ”ด `JWT_SECRET` - JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ์šฉ ์‹œํฌ๋ฆฟ ํ‚ค (์˜ˆ: `your-secret-key-min-32-characters`)
- ๐Ÿ”ด `JWT_EXPIRATION` - JWT ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (์˜ˆ: `86400000` = 24์‹œ๊ฐ„, ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„)
- ๐ŸŸก `KAKAO_CLIENT_SECRET` - ์นด์นด์˜ค ์•ฑ์˜ Client Secret (๋ณด์•ˆ ๊ฐ•ํ™” ์‹œ ํ•„์š”, ์„ ํƒ์‚ฌํ•ญ)

---

### 2๏ธโƒฃ **์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ ํ”Œ๋กœ์šฐ**

```
[ํ”„๋ก ํŠธ์—”๋“œ]                    [์นด์นด์˜ค]                    [๋ฐฑ์—”๋“œ]
     |                           |                           |
     |  1. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ         |                           |
     |-------------------------->|                           |
     |  (์นด์นด์˜ค ์ธ๊ฐ€ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ) |                           |
     |                           |                           |
     |  2. ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ & ๋™์˜     |                           |
     |                           |                           |
     |  3. ์ธ๊ฐ€ ์ฝ”๋“œ(code) ๋ฐ˜ํ™˜    |                           |
     |<--------------------------|                           |
     |  (REDIRECT_URI๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ)  |                           |
     |                           |                           |
     |  4. ์ธ๊ฐ€ ์ฝ”๋“œ ์ „๋‹ฌ          |                           |
     |------------------------------------------------->|
     |                           |                           |
     |                           |  5. ์•ก์„ธ์Šค ํ† ํฐ ์š”์ฒญ         |
     |                           |<--------------------------|
     |                           |  (POST /oauth/token)     |
     |                           |                           |
     |                           |  6. ์•ก์„ธ์Šค ํ† ํฐ ๋ฐ˜ํ™˜        |
     |                           |-------------------------->|
     |                           |                           |
     |                           |  7. ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ        |
     |                           |<--------------------------|
     |                           |  (GET /v2/user/me)       |
     |                           |                           |
     |                           |  8. ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ˜ํ™˜        |
     |                           |-------------------------->|
     |                           |                           |
     |                           |              9. ํšŒ์› ํ™•์ธ/์ƒ์„ฑ |
     |                           |              10. JWT ๋ฐœ๊ธ‰  |
     |                           |                           |
     |  11. JWT ํ† ํฐ ๋ฐ˜ํ™˜         |                           |
     |<--------------------------------------------------|
     |                           |                           |
     |  12. JWT ์ €์žฅ & ์ธ์ฆ ์™„๋ฃŒ   |                           |
     |                           |                           |
```

---

### 3๏ธโƒฃ **๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ปดํฌ๋„ŒํŠธ**

#### **A. ์˜์กด์„ฑ ์ถ”๊ฐ€** (`build.gradle`)
```gradle
dependencies {
    // ๊ธฐ์กด ์˜์กด์„ฑ...
    
    // WebClient for HTTP ํ†ต์‹ 
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    
    // JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ
    implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
    runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
    
    // DB (User ์ €์žฅ์šฉ)
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2' // ๊ฐœ๋ฐœ์šฉ, ์šด์˜ํ™˜๊ฒฝ์—์„  PostgreSQL ๋“ฑ ์‚ฌ์šฉ
}
```

#### **B. ํ™˜๊ฒฝ ์„ค์ •** (`application.yaml`)
```yaml
spring:
  application:
    name: authservice

kakao:
  rest-api-key: ${KAKAO_REST_API_KEY}
  redirect-uri: ${KAKAO_REDIRECT_URI}
  client-secret: ${KAKAO_CLIENT_SECRET:} # ์„ ํƒ์‚ฌํ•ญ
  
jwt:
  secret: ${JWT_SECRET}
  expiration: ${JWT_EXPIRATION:86400000} # ๊ธฐ๋ณธ 24์‹œ๊ฐ„

server:
  port: 8081
```

#### **C. ์ฃผ์š” ํด๋ž˜์Šค ๊ตฌ์กฐ**

```
services/authservice/src/main/java/com/labzang/api/
โ”œโ”€โ”€ kakao/
โ”‚   โ”œโ”€โ”€ http://KakaoController.java # ๊ธฐ์กด ์ปจํŠธ๋กค๋Ÿฌ
โ”‚   โ”œโ”€โ”€ http://KakaoService.java # ์นด์นด์˜ค API ํ†ต์‹  ๋กœ์ง
โ”‚   โ”œโ”€โ”€ dto/
โ”‚   โ”‚   โ”œโ”€โ”€ http://KakaoTokenResponse.java # ํ† ํฐ ์‘๋‹ต DTO
โ”‚   โ”‚   โ””โ”€โ”€ http://KakaoUserInfo.java # ์‚ฌ์šฉ์ž ์ •๋ณด DTO
โ”œโ”€โ”€ user/
โ”‚   โ”œโ”€โ”€ http://User.java # User ์—”ํ‹ฐํ‹ฐ
โ”‚   โ”œโ”€โ”€ http://UserRepository.java # User DB ์ ‘๊ทผ
โ”‚   โ””โ”€โ”€ http://UserService.java # User ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
โ”œโ”€โ”€ jwt/
โ”‚   โ”œโ”€โ”€ http://JwtTokenProvider.java # JWT ์ƒ์„ฑ/๊ฒ€์ฆ
โ”‚   โ””โ”€โ”€ http://JwtProperties.java # JWT ์„ค์ • ํด๋ž˜์Šค
โ””โ”€โ”€ config/
    โ””โ”€โ”€ http://WebClientConfig.java # WebClient ์„ค์ •
```

---

### 4๏ธโƒฃ **๊ตฌํ˜„ ์ˆœ์„œ**

1. **์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ฐ ํ™˜๊ฒฝ ์„ค์ •**
   - `build.gradle`์— WebClient, JWT, JPA ์ถ”๊ฐ€
   - `application.yaml`์— ์นด์นด์˜ค/JWT ์„ค์ • ์ถ”๊ฐ€
   - `docker-compose.yaml`์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถ”๊ฐ€

2. **JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ ์œ ํ‹ธ๋ฆฌํ‹ฐ**
   - `JwtTokenProvider` ํด๋ž˜์Šค ์ƒ์„ฑ
   - JWT ์ƒ์„ฑ, ๊ฒ€์ฆ, ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

3. **User ์—”ํ‹ฐํ‹ฐ ๋ฐ Repository**
   - `User` ์—”ํ‹ฐํ‹ฐ (id, kakaoId, email, name ๋“ฑ)
   - `UserRepository` ์ธํ„ฐํŽ˜์ด์Šค
   - `UserService` (ํšŒ์› ํ™•์ธ/์ƒ์„ฑ ๋กœ์ง)

4. **์นด์นด์˜ค API ํ†ต์‹  ์„œ๋น„์Šค**
   - `KakaoService` ํด๋ž˜์Šค ์ƒ์„ฑ
   - ์•ก์„ธ์Šค ํ† ํฐ ์š”์ฒญ ๋ฉ”์„œ๋“œ (`getAccessToken`)
   - ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ ๋ฉ”์„œ๋“œ (`getUserInfo`)

5. **์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ •**
   - `GET /kakao/callback` - ์ธ๊ฐ€ ์ฝ”๋“œ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ
   - `POST /kakao/login` - ์‚ญ์ œ ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ

6. **ํ”„๋ก ํŠธ์—”๋“œ ์ˆ˜์ •**
   - ์นด์นด์˜ค ์ธ๊ฐ€ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
   - ์ฝœ๋ฐฑ์—์„œ ๋ฐ›์€ JWT ํ† ํฐ ์ €์žฅ

---

### 5๏ธโƒฃ **API ์—”๋“œํฌ์ธํŠธ ์„ค๊ณ„**

#### **ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ˜ธ์ถœํ•  ์—”๋“œํฌ์ธํŠธ:**

1. **`GET /api/auth/kakao/login`** (์ƒˆ๋กœ ์ถ”๊ฐ€ ๊ถŒ์žฅ)
   - ์นด์นด์˜ค ์ธ๊ฐ€ URL ์ƒ์„ฑ ๋ฐ ๋ฐ˜ํ™˜
   - ์‘๋‹ต: `{ "authUrl": "https://kauth.kakao.com/oauth/authorize?..." }`
   - ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ด URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

2. **`GET /api/auth/kakao/callback?code={์ธ๊ฐ€์ฝ”๋“œ}`**
   - ์นด์นด์˜ค์—์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ ์ธ๊ฐ€ ์ฝ”๋“œ ์ฒ˜๋ฆฌ
   - ์•ก์„ธ์Šค ํ† ํฐ ์š”์ฒญ → ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ → ํšŒ์› ํ™•์ธ/์ƒ์„ฑ → JWT ๋ฐœ๊ธ‰
   - ์‘๋‹ต: `{ "success": true, "token": "jwt-token", "user": {...} }`

---

### 6๏ธโƒฃ **๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ**

- โœ… **JWT Secret**: ์ตœ์†Œ 32์ž ์ด์ƒ์˜ ๊ฐ•๋ ฅํ•œ ๋žœ๋ค ๋ฌธ์ž์—ด ์‚ฌ์šฉ
- โœ… **HTTPS**: ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ HTTPS ์‚ฌ์šฉ
- โœ… **CORS**: Gateway์—์„œ ์ด๋ฏธ ์„ค์ •๋จ (ํ™•์ธ ์™„๋ฃŒ)
- โœ… **ํ† ํฐ ์ €์žฅ**: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ `httpOnly` ์ฟ ํ‚ค ๋˜๋Š” ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— JWT ์ €์žฅ
- โœ… **Refresh Token**: ์žฅ๊ธฐ ๋กœ๊ทธ์ธ ์œ ์ง€๋ฅผ ์œ„ํ•ด Refresh Token ์ถ”๊ฐ€ ๊ณ ๋ ค

---

## ๐Ÿš€ ๋‹ค์Œ ๋‹จ๊ณ„

์ด์ œ ์œ„ ์ „๋žต์— ๋”ฐ๋ผ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ• ๊นŒ์š”? 

**์ œ๊ฐ€ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ:**
1. ์˜์กด์„ฑ ์ถ”๊ฐ€ ๋ฐ ํ™˜๊ฒฝ ์„ค์ • (`build.gradle`, `application.yaml`, `docker-compose.yaml`)
2. JWT ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์ƒ์„ฑ
3. User ์—”ํ‹ฐํ‹ฐ ๋ฐ Repository ์ƒ์„ฑ
4. KakaoService ๊ตฌํ˜„ (์นด์นด์˜ค API ํ†ต์‹ )
5. KakaoController ๋ฆฌํŒฉํ† ๋ง (์‹ค์ œ ์ธ์ฆ ๋กœ์ง)
6. ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™ ๊ฐ€์ด๋“œ

 

 


์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์•ˆํ–ˆ๋˜ ์ „๋žต์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ๋”๋ฏธ๊ฐ’ ์ฝ”๋“œ๋กœ ๋˜๋Œ๋ ธ๋„ค์š”. ์ด์ œ ์‹ค์ œ ์นด์นด์˜ค ์ธ์ฆ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์„ ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“‹ ์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ˜„ ์ „๋žต

1๏ธโƒฃ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ

ํ˜„์žฌ ์žˆ๋Š” ๊ฐ’:

  • โœ… KAKAO_REST_API_KEY (REST API ํ‚ค)
  • โœ… KAKAO_REDIRECT_URI (๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URI)
  • โš ๏ธ KAKAO_ADMIN_KEY (์„ ํƒ์‚ฌํ•ญ, ์ผ๋ฐ˜ ๋กœ๊ทธ์ธ์—๋Š” ๋ถˆํ•„์š”)

์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ๊ฐ’:

  • ๐ŸŸก KAKAO_CLIENT_SECRET (์„ ํƒ์‚ฌํ•ญ, ๋ณด์•ˆ ๊ฐ•ํ™”์šฉ, ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ)
  • ๐Ÿ”ด ์—†์Œ! ์œ„ 3๊ฐœ๋ฉด ์นด์นด์˜ค OAuth ์ธ์ฆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ ํ”Œ๋กœ์šฐ

 

3๏ธโƒฃ ๊ตฌํ˜„ ์ „๋žต (๋‹จ๊ณ„๋ณ„)

Step 1: ํ˜„์žฌ ์ฝ”๋“œ ์ƒํƒœ ํ™•์ธ

ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์‹ค์ œ OAuth ํ”Œ๋กœ์šฐ๊ฐ€ ๊ฑฐ์˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • โœ… GET /kakao/login: ์นด์นด์˜ค ์ธ์ฆ URL๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • โœ… GET /kakao/callback: ์‹ค์ œ OAuth ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ (ํ† ํฐ ๊ตํ™˜ → ์‚ฌ์šฉ์ž ์ •๋ณด → JWT ๋ฐœ๊ธ‰)
  • โŒ POST /api/kakao/login: ๋”๋ฏธ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ ์ค‘

๋ฌธ์ œ์ :

  • POST /api/kakao/login์ด ๋”๋ฏธ๊ฐ’์„ ๋ฐ˜ํ™˜  OAuth URL์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ • ํ•„์š”
  • ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ POST๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด authUrl์„ ๋ฐ›์•„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ด์•ผ ํ•จ

Step 2: ์ˆ˜์ • ๋ฐฉํ–ฅ

์ˆ˜์ •ํ•  ํŒŒ์ผ:

  1. services/auth-service/src/main/java/com/seoeunjin/api/kakao/KakaoController.java
  • POST /login ๋ฉ”์„œ๋“œ๋ฅผ ๋”๋ฏธ ์‘๋‹ต → OAuth URL ๋ฐ˜ํ™˜์œผ๋กœ ๋ณ€๊ฒฝ
  1. services/auth-service/src/main/resources/application.yaml
  • KAKAO_REST_API_KEY๋ฅผ KAKAO_CLIENT_ID๋กœ ๋งคํ•‘
  1. docker-compose.yaml
  • KAKAO_REST_API_KEY๋ฅผ KAKAO_CLIENT_ID๋กœ ์ „๋‹ฌ

์ˆ˜์ •ํ•˜์ง€ ์•Š์„ ํŒŒ์ผ:

  • GET /kakao/callback: ์ด๋ฏธ ์‹ค์ œ OAuth ํ”Œ๋กœ์šฐ ๊ตฌํ˜„๋จ โœ…
  • KakaoOAuthService: ์ด๋ฏธ ์นด์นด์˜ค API ํ†ต์‹  ๊ตฌํ˜„๋จ โœ…

Step 3: ๊ตฌํ˜„ ์ฝ”๋“œ ์ œ์•ˆ

1) POST /api/kakao/login ์ˆ˜์ •

 

2) application.yaml ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋งคํ•‘

 

3) docker-compose.yaml ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ „๋‹ฌ

 

Step 4: ํ”„๋ก ํŠธ์—”๋“œ ์ˆ˜์ • (์ฐธ๊ณ )

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌ:

 

4๏ธโƒฃ ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์ฝ˜์†” ์„ค์ • ํ™•์ธ

  1. https://developers.kakao.com/ ์ ‘์†
  1. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜  ์•ฑ ์„ ํƒ
  1. ์•ฑ ํ‚ค ํ™•์ธ
  • REST API ํ‚ค ๋ณต์‚ฌ  .env์— KAKAO_REST_API_KEY=xxx ์„ค์ •
  1. ์ œํ’ˆ ์„ค์ • → ์นด์นด์˜ค ๋กœ๊ทธ์ธ
  • ํ™œ์„ฑํ™” ์ƒํƒœ ํ™•์ธ: ON
  • Redirect URI ๋“ฑ๋ก: http://localhost:8080/oauth2/kakao/callback
  1. ๋™์˜ ํ•ญ๋ชฉ ์„ค์ •
  • ๋‹‰๋„ค์ž„: ํ•„์ˆ˜
  • ํ”„๋กœํ•„ ์‚ฌ์ง„: ์„ ํƒ
  • ์นด์นด์˜ค๊ณ„์ •(์ด๋ฉ”์ผ): ํ•„์ˆ˜ ๋˜๋Š” ์„ ํƒ

5๏ธโƒฃ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (.env ํŒŒ์ผ)
     
  1. ์„œ๋น„์Šค ์žฌ์‹œ์ž‘
     
  1. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ
  • POST /api/kakao/login ํ˜ธ์ถœ
  • ์‘๋‹ต์—์„œ authUrl ๋ฐ›์Œ
  • authUrl๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  1. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ
  • ๋™์˜ ํ•ญ๋ชฉ ํ™•์ธ ํ›„ ๋™์˜
  1. ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ
  • ์นด์นด์˜ค๊ฐ€ http://localhost:8080/oauth2/kakao/callback?code=xxx๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • ๋ฐฑ์—”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ํ† ํฐ ๊ตํ™˜ → ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ → JWT ๋ฐœ๊ธ‰
  • http://localhost:3000/dashboard/kakao๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  1. ๋กœ๊ทธ ํ™•์ธ
     
  • "์นด์นด์˜ค Access Token ํš๋“ ์„ฑ๊ณต" ์ถœ๋ ฅ ํ™•์ธ
  • "๋กœ๊ทธ์ธ ์„ฑ๊ณต!" ์ถœ๋ ฅ ํ™•์ธ

6๏ธโƒฃ ์ „๋žต ์š”์•ฝ

๊ตฌ๋ถ„ํ˜„์žฌ ์ƒํƒœ์ˆ˜์ • ํ•„์š”

GET /kakao/login โœ… OAuth URL ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์—†์Œ
POST /api/kakao/login โŒ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜ OAuth URL ๋ฐ˜ํ™˜์œผ๋กœ ์ˆ˜์ •
GET /kakao/callback โœ… ์‹ค์ œ OAuth ์ฒ˜๋ฆฌ ์—†์Œ
KakaoOAuthService โœ… ์นด์นด์˜ค API ํ†ต์‹  ์—†์Œ
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ KAKAO_REST_API_KEY ์กด์žฌ application.yaml์—์„œ ๋งคํ•‘๋งŒ ์ถ”๊ฐ€

๊ฒฐ๋ก : POST /api/kakao/login๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๊ธˆ ์•„์ง ์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ˜„ ์ด ์•ˆ๋˜์–ด์žˆ๋Š”๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์ชฝ์— ํ•ด๋‹ฌ๋ผ๊ณ  ์ž…๋ ฅํ•ด์•ผํ•˜๋Š” ๋‚ด์šฉ์€ ๋ญ์•ผ? ์ „๋žต๋งŒ ์•Œ๋ ค์ค˜

 

์ง€๊ธˆ ์•„์ง ์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ ๊ตฌํ˜„ ์ด ์•ˆ๋˜์–ด์žˆ๋Š”๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์ชฝ์— ํ•ด๋‹ฌ๋ผ๊ณ  ์ž…๋ ฅํ•ด์•ผํ•˜๋Š” ๋‚ด์šฉ์€ ๋ญ์•ผ? ์ „๋žต๋งŒ ์•Œ๋ ค์ค˜

 
 
์นด์นด์˜ค OAuth 2.0 ์ธ์ฆ์„ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์—ฐ๋™ํ•  ๋•Œ ํ•„์š”ํ•œ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์—ฐ๋™ ์ „๋žต

  1. ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ
  • POST http://localhost:8080/api/kakao/login ํ˜ธ์ถœ
  • ์‘๋‹ต์—์„œ { success: true, authUrl: "..." } ํ˜•ํƒœ๋กœ ์นด์นด์˜ค ์ธ์ฆ URL์„ ๋ฐ›๊ณ , window.location.href = authUrl๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ.
  1. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฐ ๋™์˜
  • ์‚ฌ์šฉ์ž๊ฐ€ ์นด์นด์˜ค ํŽ˜์ด์ง€์—์„œ ๋กœ๊ทธ์ธ ํ›„ ๋™์˜ํ•˜๋ฉด, ๋“ฑ๋กํ•ด ๋‘” REDIRECT_URI(์˜ˆ: http://localhost:8080/oauth2/kakao/callback)๋กœ ์ธ๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ๋จ.
  1. ๋ฐฑ์—”๋“œ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ
  • GET /oauth2/kakao/callback?code=xxxx์—์„œ ๋ฐฑ์—”๋“œ๊ฐ€ ํ† ํฐ ๊ตํ™˜ → ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ → JWT ๋ฐœ๊ธ‰ → ์ฟ ํ‚ค ์„ค์ • ํ›„ http://localhost:3000/dashboard/kakao๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ.
  1. ํ”„๋ก ํŠธ์—”๋“œ ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€
  • /dashboard/kakao ์ง„์ž… ์‹œ ๋ฐฑ์—”๋“œ๊ฐ€ ์„ค์ •ํ•œ access_token ์ฟ ํ‚ค๋ฅผ ์ฝ์–ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ API ํ˜ธ์ถœ์— ์‚ฌ์šฉ.

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ•ด์•ผ ํ•  ํ•ต์‹ฌ ์ž‘์—…

  • ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์—์„œ ์œ„ API ํ˜ธ์ถœ ๋ฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (์นด์นด์˜ค SDK ์ง์ ‘ ์‚ฌ์šฉ X)
  • ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€์—์„œ access_token ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ.
์ด ํ๋ฆ„๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฐฑ์—”๋“œ๊ฐ€ OAuth ๋กœ์ง์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์นด์นด์˜ค ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด๊ณ  ๋Œ์•„์˜จ ๋’ค ๊ฒฐ๊ณผ ํ™”๋ฉด๋งŒ ํ‘œ์‹œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•ด์ปคํ†ค ์ค€๋น„ํ•˜์ž! ํŒŒ์ด์ฌ ํ•˜์ž 

 

fastapi์— open ai api๋ฅผ ๋นŒํŠธ์ธํ•œ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” cli๋ฅผ ์ œ๊ณตํ•ด์ค˜

 

 

 

 

https://www.anaconda.com/download

 

Free Download | Anaconda

Download Anaconda's open-source Distribution today. Discover the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

 

 

 

 

์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ํ•˜๋Š”๋ฐ ๋‚ด ๋…ธํŠธ๋ถ์— ์„ค์น˜ํ•˜๋ ค๋Š”๋ฐ, ํŒŒ์ดํ† ์น˜ ํ…์„œํ”Œ๋กœ๋“ฑ ์ธ๊ณต์ง€๋Šฅ ๊ฐœ๋ฐœ์„ ํ• ๊ฑด๋ฐ ์–ด๋А๊ฒƒ์„ ์ถ”์ฒœํ•ด

 

๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋ฌด์ง€์„ฑ์œผ๋กœ ๋‹ค์Œ ๋ˆŒ๋ €์Œ

 

 

 

ใ„ฒ

 

 

์œˆ๋„์šฐ ๏ฝ’

 

CONDA_HOME

๋Œ€๋ฌธ์ž๋กœ ํ•จ

 

๏ผ๋‚˜๋จธ์ง€๋Š” ์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ํ•˜๊ธฐ ๊ฒŒ์‹œ๋ฌผ ์ฐธ๊ณ 


 

 

 

๊ทธ๋ž˜๋“ค ๋“ค์–ด๊ฐ„๊ฑฐ ๋นผ๊ณ ๋Š” ๊ตฌ์กฐ ๋งž์ถฐ์„œ ๋งŒ๋“ค๊ธฐ

 

 

mkdir gateway

๏ผํด๋” ๋งŒ๋“ค๊ธฐ 

 

์˜ˆ ๋ˆ„๋ฅด๊ธฐ

 

 

 

ํŒŒ์ผ๋“ค ๋งŒ๋“ค๊ธฐ

@gateway/main.py ์ด ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ํฌํŠธ 9000 ์—์„œ ”์•ˆ๋…• ํŒŒ์ด์ฌ“์ด ์ถœ๋ ฅ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜

@gateway/main.py @Dockerfile @docker-compose.yaml docker compose up์„ ํ•˜๋ฉด main.py์„ ์‹คํ–‰ํ•ด

 

์„ค์น˜ํ•˜๋ผ๊ณ  ํ•ด์„œ ์„ค์น˜ํ–ˆ์Œ

 

 

gateway์—์„œ swagger๋กœ ๋ณด์ด๋„๋ก ํ•ด์ค˜

 

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • docker compose up --build ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:9000/docs๋กœ ์ ‘์†ํ•˜๋ฉด Swagger ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , /hello ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด "์•ˆ๋…• ํŒŒ์ด์ฌ" ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • ํ˜„์žฌ ํŽธ์ง‘ ํ™˜๊ฒฝ์— FastAPI/uvicorn ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•„ IDE์—์„œ ์ž„ํฌํŠธ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋‚˜ pip install -r requirements.txt ์‹คํ–‰ ํ›„์—” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.