
목 차
1. API 기본 개념 이해
2. API의 기본 구조와 작동 원리
3. API 사용 시 꼭 알아야 할 핵심 요소
4. API 형식과 선택 기준
5. API 활용 방식에 따른 분류.
6. 실무 중심 API 활용 전략.
7. API 설계 철학 및 아키텍처 전략
8. API 성능 최적화 및 확장성 대응
9. API 테스트, 배포, 모니터링 자동화
10. API 보안 심화 및 실제 보안 위협 대응.

💡 API는 애플리케이션 프로그래밍 인터페이스(Application Programming Interface)의 줄임말로, '소프트웨어 구성 요소 간의 상호작용을 위한 명세'입니다.
소프트웨어 '애플리케이션이 서로 통신하고 데이터나 기능을 교환할 수 있도록 하는 규칙이나 프로토콜'을 의미합니다.
시스템 간의 '통신 방법'을 정의하는 '인터페이스'로,
'특정 기능이나 데이터를 외부에 제공하는 규격'입니다.
API를 통해 개발자는 다른 애플리케이션의 기능을 '직접 구현하지 않고도 쉽게 활용' 가능하며, '애플리케이션 개발을 간소화하고 효율성을 높일 수 있습니다.'
예를 들어, '웹 API'는 클라이언트(웹/앱)가 서버에서 데이터를 요청하고, 서버가 이를 응답하는 방식으로 동작합니다.

과거에는 프로그램 간 직접 통신이 매우 어려워, 개발자가 수작업으로 일일이 대응해야 했습니다.
API는 서버와 클라이언트, 또는 다른 시스템 간에 정보를 주고받을 수 있는 규칙을 정의합니다.
현재는 API를 통해 일정한 구조와 규약을 설정하고 통신이 가능.
훨씬 효율적이고 체계적인 시스템을 구축 가능.

API는 내부 구현을 숨기고 외부 사용자는 단순화된 인터페이스를 통해 원하는 기능을 사용 가능합니다.
'추상화'를 통해 개발자는 API의 세부 구현사항을 몰라도,
필요한 작업을 API를 통해 쉽게 사용 가능합니다.

RPC (Remote Procedure Call):
서버의 함수를 원격에서 호출할 수 있는 방법으로,
서버와 클라이언트 간의 원격 함수 호출 방식입니다.
SOAP (Simple Object Access Protocol):

REST (Representational State Transfer):
REST는 간결하고 직관적인 구조로 인해 웹 서비스의 표준으로 자리잡았습니다.

GraphQL:
gRPC:
Web API:

API를 사용하면 백엔드(서버)와 프론트엔드(클라이언트)가 독립적으로 개발될 수 있습니다.
비즈니스 로직은 서버에서 처리하고,
사용자 인터페이스(UI)는 클라이언트에서 처리하는 분리된 구조로 시스템을 구축할 수 있습니다.

API를 통해 백엔드 서버는 다양한 플랫폼(웹, 모바일 앱 등)에서 동일하게 활용됩니다.
예를 들어, 모바일 앱과 웹 애플리케이션은 같은 API를 호출하여 데이터를 가져옵니다.

오픈 API를 통해
외부 개발자들이 특정 서비스에 기능을 추가하거나 새로운 서비스를 구축할 수 있습니다.
예: OAuth를 통해 구글 로그인 기능을 외부 앱에 통합
예: 결제 API를 이용해 쇼핑몰에서 결제 시스템을 구축
예: 번역 API를 사용해 다국어 지원 기능을 추가


API는 클라이언트-서버 아키텍처를 기반으로 동작합니다.
RESTful API는 URL(자원 식별)과 HTTP 메서드를 조합하여,
데이터를 CRUD(Create, Read, Update, Delete) 방식으로 다룹니다.


서버: 비즈니스 로직 수행, DB 접근, 리소스 관리 등 기능 제공
클라이언트: API를 통해 데이터를 요청하고 UI에 반영하는 소비자

API 호출 주소는 일반적으로 RESTful 경로로 구성됩니다.
명확한 리소스 구조로 표현해야 직관적입니다.



API는 요청(request)과 응답(response)의 구조를 기반으로 동작합니다.
요청(Request): 클라이언트(사용자)가 서버에 필요한 정보를 요구하는 것.
GET /api/users/1 HTTP/1.1
Host: example.com
Authorization: Bearer <token>
Accept: application/json
응답(Response): 서버가 요청을 처리한 후 클라이언트에게 결과를 돌려주는 것.
JSON (JavaScript Object Notation):
Key와 Value로 구성된 가볍고 직관적인 데이터 형식입니다.
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Jane Doe",
"email": "jane@example.com"
}



클라이언트가 요청을 보냄 (예: GET /api/products)
서버가 요청을 처리하고 필요한 데이터를 조회
처리 결과를 응답으로 전달 (예: JSON 형태)



REST API는 Stateless(무상태)해야 합니다.
모든 요청은 필요한 정보를 자체적으로 포함해야 합니다.

API 명세를 문서화하고 시각화할 수 있는 자동화 도구
OpenAPI 스펙을 기반으로 작성된 API 정의는 Swagger UI로 인터랙티브하게 테스트 가능
백엔드 개발 시, API 명세와 개발이 동시에 이루어져 협업 및 유지보수에 유리

API 요청을 직접 테스트하고 자동화할 수 있는 API 클라이언트 툴
실무에서 백엔드와 연동 테스트, 오류 확인, 문서화 등에 사용


웹 브라우저는 '보안'을 위해 기본적으로 '다른 출처(origin)의 리소스에 접근을 제한' 합니다.
출처(origin)는 "프로토콜 + 도메인 + 포트"로 구성됩니다.


하지만 현실 개발환경에서는 다양한 상황에서 출처가 다른 API 요청이 필요합니다.
ex)
프론트엔드: http://localhost:3000
백엔드 API: http://localhost:5000
이때 클라이언트가 백엔드 API에 요청을 보내면 Cross-Origin 요청이 발생합니다.

브라우저는 다음과 같은 상황에서 요청을 차단(CORS 에러 발생)합니다:
1.다른 출처에 POST 요청을 보냈지만, 서버가 CORS 설정을 안 함
2.인증 헤더(Authorization)를 포함한 요청인데, 서버가 허용하지 않음
3.Content-Type이 application/json인 요청인데, 서버가 미리 허용 안 함
서버가 명시적으로 "Access-Control-Allow-Origin" 헤더를 포함해 응답하지 않으면
브라우저가 응답을 차단합니다.

복잡한 요청(예: PUT, DELETE, Content-Type: application/json)은 실행 전에
사전 검사 요청(Preflight Request)를 보냅니다.
이때 OPTIONS 메서드를 사용하여 서버에 허용 여부를 확인합니다.
Preflight 요청 흐름:
1.브라우저가 OPTIONS 요청을 먼저 전송
2.서버가 허용 가능한 메서드, 헤더 등을 명시한 응답을 전송
3.조건에 맞으면 브라우저가 실제 요청을 보냄
OPTIONS /api/data HTTP/1.1
Origin: http://localhost:3000
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
서버가 위와 같이 응답하면, 브라우저는 POST 요청을 허용합니다.



인증(Authentication): "너는 누구니?"
→ 사용자의 신원을 확인
인가(Authorization): "이 기능을 사용할 권한이 있니?"
→ 사용자가 특정 리소스에 접근할 수 있는지 확인



Access Token
Refresh Token
💡 Refresh Token은 절대로 클라이언트에서 노출되면 안 됩니다.!!

{
"status": 400,
"error": "Bad Request",
"message": "username is required",
"timestamp": "2025-05-07T12:34:56Z",
"path": "/api/users"
}



API 남용, DDoS 방지용으로 일정 시간 내 요청 수 제한.
const rateLimit = require('express-rate-limit');
app.use(rateLimit({
windowMs: 1 * 60 * 1000, // 1분
max: 100, // 최대 100건
message: "Too many requests"
}));

사용자 ID 또는 JWT sub 필드를 기준으로 제한 가능
Redis를 사용해 분산 환경에서도 관리 가능.

클라이언트가 예상하는 API 응답이 바뀔 경우, 오류 유발.
새 기능 추가 시, 기존 사용자를 꺠지 않기 위해 버전 관리 필수.



v1을 유지하고, v2를 병렬 제공
가능하면 기존 응답 구조는 변경하지 않기
파라미터나 필드를 선택적으로 추가.



REST(Representational State Transfer)는 자원을 URL로 표현하고,
HTTP 메서드로 동작을 정의하는 방식 입니다.
예: /users/123 → 특정 사용자 리소스

| HTTP 메서드 | 의미 | 예시 URL | 설명 |
|---|---|---|---|
| GET | 조회 | /users/list | 사용자 목록 조회 |
| POST | 생성 | /users/create | 사용자 생성 |
| PUT/PATCH | 수정 | /users/update | 사용자 정보 수정 |
| DELETE | 삭제 | /users/delete | 사용자 삭제 |

구조가 단순하고 직관적
HTTP 기반이므로 모든 플랫폼에서 사용 가능
다양한 캐싱, 보안, 로깅 도구와 호환
과도한 데이터 요청/전송 문제 ( 필요 없는 데이터까지 전송 )
복잡한 관계형 데이터 표현에 한계.
💡 REST는 대부분의 CRUD 중심 시스템에 적합하며,
대다수 서비스 백엔드 기본 구조로 사용됩니다.

meta가 만든 쿼링 언어.
클라이언트가 정확히 원하는 '데이터 구조를 요청' 가능.
query {
user(id: "1") {
name
posts {
title
}
}
}

Over-fetching, Under-fetching 해결
하나의 요청으로 여러 리소스 데이터 통합 가능
API 버전 관리 불필요 (필드 단위 요청/응답 가능)

러닝 커브 존재 (스키마 설계, Resolver 구현 등)
캐싱이 어려움 (GET URL 기반 캐시 불가)
파일 업로드, 인증 등 REST보다 구현 복잡
💡 모바일, SPA 환경에서 효율적이며, 복잡한 관계형 데이터 UI가 필요한 경우에 적합합니다.

구글에서 만든 '이진 직렬화 기반 고속 API 프레임워크'
HTTP/2 기반 -> 멀티플렉싱, 바이너리 전송

REST보다 데이터 전송량 작고 속도 빠름.
자동화된 클라이언트 SDK 생성.
양방향 스트리밍 지원.

마이크로서비스 아키텍처 내부 통신
IoT, 게임 서버, 고성능 백엔드 서비스 등

브라우저 직접 호출 불가 -> 중간 Proxy 필요
디버깅 도구나 로딩 환경 제한적
초기 설정 복잡 (IDL 정의, 스텁 생성 등)
💡 내부 서비스 간 고성능 통신이 필요한 B2B 시스템에 적합합니다.

HTTP 요청/응답 구조와 달리, 지속적인 연결 유지.
서버 -> 클라이언트로 직접 데이터 푸시 가능.

채팅, 실시간 알림
주식 시세, 게임 상태 전파
협업 툴 (예: Google Docs 실시간 동기화)
💡 브라우저 환경, 연결 유지 전략, 네트워크 제한 등을 고려해 선택합니다.


📌 마무리 팁
REST: 기본 CRUD 중심 서비스, 백오피스, 단순 API
GraphQL: 유연한 프론트엔드 데이터 제어, 모바일/SPA
gRPC: 내부 시스템 통신, 성능 중심 서비스
WebSocket/SSE: 실시간 알림, 채팅, 스트리밍 서비스

인증 없이 또는 간단한 API 키만으로 사용 가능.
일반 대중 또는 개발자 커뮤니티에 서비스 기능을 개방.

GitHub REST API
OpenWeatherMap API
Google Maps (제한 범위 내에서 공개 키로 사용 가능)

생태계 확장 ( 외부 개발자 유입 )
브랜드 인지도 증가
다양한 써드파티 앱과의 통합 촉진.

남용 방지를 위한 Rate Limiting
간단한 인증(Tokens), CORS 정책 등 필수

외부지만, 공식적으로 제휴를 맺은 파트너만 사용 가능.
일반 사용자에게는 비공개.

API Key 또는 OAuth 기반 인증 필요
문서 접근 및 사용 권한은 협약에 따라 제한됨

결제 게이트웨이 API (카카오페이, Toss 등)
네이버 검색광고 API
물류 연동 API (쿠팡 파트너사 배송 연동)

비즈니스 협력 강화
외부 기업과의 시스템 통합 자동화
거래/인증 기반 서비스 제공.

외부에는 전혀 노출되지 않음.
'사내 웹/앱, 백오피스, 마이크로서비스 간 통신'에 사용!

인증, 권한 검증 로직 필수
보안이 최우선!! (VPN, IP 화이트리스트 등 사용)

내부 시스템 모듈화 및 재사용성 확보.
DevOps 배치 처리, 내부 자동화 툴 등에 활용.
실시간 모니터링, 로깅 등 백엔드 통합.
💡 예: inventory.internal.company.com/api/stock-check

여러 리소스 또는 엔드포인트 호출을 묶어서 한 번에 응답.
클라이언트 입장에서 API 호출 횟수를 줄이는 데 효과적.
/user-profile 호출 시, 사용자 정보 + 주문 이력 + 알림 설정 통합 반환
마이크로서비스로 구성된 여러 개의 API 결과값을 서버에서 미리 합쳐서 반환.
네트워크 비용 절감 (요청 횟수 줄임)
프론트엔드/모바일에서 '로딩 속도 향상'
GraphQL과 유사한 효과를 REST 방식에서도 일부 구현 가능.
복잡한 조합일수록 서버 측 구현 난이도 증가
응답 실패 시 오류 원인 추적이 어려울 수 있음.



'fetch' : 브라우저 기본 내장 함수.
fetch('/api/user/1')
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
axios
const response = await axios.get('/api/user/1');
console.log(response.data);

데이터 패칭, 캐싱, 리페치, 에러/로딩 상태 관리를 추상화한 라이브러리.
'React Query' : 강력한 캐시 정책, 백그라운드 리페치, 자동 리트라이 제공.
'SWR' : 'Stale - While - Revalidate' / 전략 기반, 가볍고 빠른 경험 제공.

캐싱.
로딩 처리.
에러 처리.

라우터 기반으로 각 URL에 기능 바인딩.
기본 흐름
예시.
app.get('/api/users/:id', (req, res) => {
const user = db.find(u => u.id === req.params.id);
res.json(user);
});
특징.

Node.js + TypeScript 기반의 의존성 주입(DI), 모듈 구조, 데코레이터 기반 개발 방식 제공.
장점.
기본 구조.
Controller: 라우팅 정의 (@Get(), @Post() 등)
Service: 비즈니스 로직
Module: 각 기능 단위 묶음
예시.
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get(':id')
findOne(@Param('id') id: string) {
return this.userService.findById(id);
}
}
기타 기능

Python 3.6+ 타입 힌트를 적극 활용하는 비동기 웹 프레임워크. 빠른 개발과 높은 성능이 특징.
특징.
Pydantic을 기반으로 한 입력/출력 데이터 자동 유효성 검사
자동 Swagger UI 문서 생성
비동기 처리를 지원하는 async def 기반 구조
OpenAPI 및 JSON Schema 완전 지원
기본 구조.
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{id}")
async def get_user(id: int):
return {"id": id, "name": "John"}
장점.


Express에서 CORS 설정.
Express에서는 cors 미들웨어를 사용하여 간편하게 CORS 설정 가능.
설치.
기본 예시.


Nest.js에서 CORS 설정.
Nest.js는 내부적으로 Express (또는 Fastify)를 사용하므로, CORS는 main.ts에서 설정함.
기본 설정 (main.ts)


Fastify로 사용하는 경우.
-Fastify CORS 플러그인 설치 후 NestFactory.create NestFastifyApplication으로 설정 필요.
FastAPI에서 CORS 설정.

- allow_origins=["*"] → 모든 도메인 허용 (실제 서비스에서는 특정 도메인만 허용해야 보안상 안전)
- allow_credentials=True → 쿠키 전송 허용 시 필요

프론트엔드 개발 중 CORS 오류는
백엔드가 외부 출처 요청을 허용하지 않아서 발생하는 보안 정책 오류임.
개발환경에서는 "*"로 허용 가능하지만,
운영환경에서는 반드시 origin을 명시하고 인증 정책과 함께 설계해야 함.
OPTIONS 프리플라이트 요청이 발생하는 조건:
Content-Type이 application/json이 아닌 경우
Authorization 헤더가 포함된 경우
PUT, DELETE 등 "단순하지 않은 요청"


장점.

장점.
FastAPI는 OpenAPI (Swagger UI)를 기본 내장합니다. 설정 없이도 자동 문서화됩니다.
접속 경로.
예시.

장점.
문서 자동 생성 (Pydantic 기반)
파라미터, 응답 타입, 설명 등 자동 인식

성능 분석 : Date.now()로 요청/응답 시간 계산
로그 시스템 : winston, morgan

Interceptor 기반 요청 시간 측정.
Logger는 기본 @nestjs/common에서 제공.

X-Process-Time 헤더에 응답 시간 추가.
외부 툴: Prometheus + Grafana, Sentry, Datadog 등 연동 가능.


인증/인가 처리
라우팅 및 로깅
트래픽 제한 (Rate Limiting)
Failover, Load Balancing
API Gateway: AWS API Gateway, Kong, NGINX, Traefik
BFF (Backend for Frontend): 클라이언트별 최적화 백엔드 (예: React용 전용 API 라우터)
@Module 단위로 프론트엔드 별 분리 API 구성
예: WebApiModule, MobileApiModule
app.include_router(web_router, prefix="/web")
app.include_router(mobile_router, prefix="/mobile")

REST(Representational State Transfer)는 HTTP 기반의 아키텍처 스타일로,
자원을 명확히 정의하고 이를 HTTP 메서드로 처리하는 방식입니다.
단순히 API를 만드는 기술이 아니라,
"어떻게 하면 명확하고 일관된 규칙으로 API를 설계할 수 있을까"에 대한 철학적인 지침을 제공합니다.
자원 중심(Resource-Oriented): URI는 자원을 식별합니다.
행위는 HTTP 메서드로 구분.
GET: 조회
POST: 생성
PUT: 전체 수정
PATCH: 부분 수정
DELETE: 삭제
Stateless:
계층 구조의 URI 설계:
표현의 전이(Representation):

API의 성공/실패 응답 구조가 통일되어 있으면, 클라이언트는 처리 로직을 단순화할 수 있고, 에러 처리도 일관되게 구현할 수 있습니다.



URL 기반 (가장 일반적): /api/v1/users
Header 기반: Accept: application/vnd.myapi.v2+json
Media Type 기반: REST 원칙에는 더 충실하지만 실무에서는 적용 복잡도가 있음
문서화 필요성 증가
Deprecated 버전 유지 기간 명시

필터링: /products?category=shoes
정렬: /products?sort=price_desc
페이징: ?limit=10&page=2
필드 선택(Field Masking): /users/1?fields=id,name,email
HATEOAS 적용 여부:



도메인 모델 중심으로 API URI 설계
UserService → /users
OrderService → /orders
Bounded Context 단위 API 설계:

모든 API 요청의 진입점 역할
주요 기능: 인증, 라우팅, 속도 제한, CORS, 로깅
예시 도구: AWS API Gateway, Kong, NGINX

프론트엔드마다 맞춤형 API 제공
모바일 vs 웹의 요청 양식이 다른 경우 효과적
장점: 프론트 요구사항에 최적화 → 불필요한 데이터 제거


GraphQL Federation: 마이크로서비스 환경에서 GraphQL API 통합 전략
gRPC 정의서 관리: .proto 파일을 Git 저장소에서 버전 관리하며 코드 생성 자동화


Join, Eager Loading, Batch Query 적용
DTO 사용으로 Projection 처리

CDN: 이미지/정적 리소스 분산 제공 → CloudFront, Cloudflare
Redis Cache: 빈번한 요청에 대한 API 응답 캐싱
Reverse Proxy: NGINX 활용 → 정적 리소스는 프록시 서버가 처리
ETag / Last-Modified: 변경 여부 체크 → 304 응답으로 불필요한 재전송 방지

사용자/토큰/IP 단위 제한
구현 도구: NGINX, API Gateway, Redis + Express Rate Limit
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
limit_req zone=mylimit burst=20;

이메일 전송, 이미지 리사이징, 통계 수집 등
사용 도구: RabbitMQ, Kafka, AWS SQS
방식: Producer → Queue → Consumer 처리


Circuit Breaker (Hystrix, Resilience4j 등): 장애 발생 시 자동 차단
Retry & Timeout 설정: axios-retry 등 클라이언트 레벨에서 설정 가능
