웹 서비스 개발 – 웹 서비스 보안 – 4 – API 보안 및 인증 방법

웹 서비스 개발 - 웹 서비스 보안 - 4 - API 보안 및 인증 방법
웹 서비스 개발 – 웹 서비스 보안 – 4 – API 보안 및 인증 방법

웹 서비스 개발 – 웹 서비스 보안 – 4 – API 보안 및 인증 방법

안녕하세요, 책임감 있는 개발자 여러분 😊
이번 시간에는 웹 API를 안전하게 보호하고 인증하는 방법에 대해 자세히 알려드릴게요!
웹 서비스에서 API는 클라이언트와 서버가 데이터를 주고받는 출입문과도 같은 존재입니다.
그런데 이 출입문에 열쇠도 없고, 경비도 없다면…? 누구나 침입할 수 있겠죠?

API는 편리한 만큼 공격받기 쉽기 때문에, 반드시 보안 설계와 인증 메커니즘을 철저히 갖추어야 합니다.
오늘은 그 방법들을 총정리해드릴게요!


1. API의 보안이 왜 중요할까요?

API는 데이터를 주고받는 통로이기 때문에

  • 개인정보 유출
  • 권한 없는 사용자 접근
  • 데이터 변조 및 조작
  • 서버 리소스 남용
    등 수많은 위협에 노출될 수 있어요.

📦 마치 택배 기사님이 비밀번호 없는 공동현관을 자유롭게 드나드는 상황과 비슷하죠!
API에도 문단속이 필요합니다.


2. 인증(Authentication) vs 권한(Authorization)

이 둘은 혼동하기 쉽지만 완전히 다른 개념이에요!

구분 설명 예시
인증(Authentication) “누구세요?” – 사용자가 누구인지 확인 로그인, API 키, 토큰 등
권한(Authorization) “이걸 할 수 있나요?” – 접근 권한 확인 관리자만 가능한 삭제 기능 등

✅ 인증 후에도 역할 기반(Role-Based) 권한 검사가 함께 필요합니다!


3. API 인증 방법 5가지


1) API Key 인증 (가장 기본)

클라이언트에게 **고유 키(API Key)**를 발급해서 요청 시 포함시키는 방식입니다.

GET /api/data  
Headers: X-API-KEY: abc123xyz

서버는 이 키를 데이터베이스나 환경변수에서 확인합니다.

✅ 장점: 간단하고 빠름
❌ 단점: 노출되면 무방비! 사용자 식별이 어려움

🔐 Tip: IP 제한, 키 주기적 재발급과 함께 쓰세요!


2) HTTP Basic 인증 (간단한 사용자 인증)

아이디/비밀번호를 base64로 인코딩해서 전달하는 방식입니다.

Authorization: Basic dXNlcjpwYXNzMTIz

✅ 장점: 간단함, 표준화
❌ 단점: 암호 노출 위험 → HTTPS 필수

⚠️ 대부분의 서비스에서는 단독 사용보다는 테스트 또는 내부 API용으로 사용합니다.


3) OAuth 2.0 (대표적인 인증 프레임워크)

OAuth는 타사 인증 서버를 통해 사용자 인증을 위임하는 방식이에요.
Google, Facebook 로그인 등이 이에 해당하죠!

흐름 요약

  1. 사용자가 OAuth 서버에 로그인
  2. 서버가 access token을 클라이언트에 전달
  3. 클라이언트는 이 토큰으로 API 요청
Authorization: Bearer eyJhbGciOi...

✅ 장점: 강력하고 유연함, 권한 위임 구조
❌ 단점: 구현이 복잡할 수 있음


4) JWT (JSON Web Token)

JWT는 사용자 정보를 포함한 디지털 서명된 토큰으로,
로그인 후 클라이언트가 이 토큰을 들고 다니며 API에 접근할 수 있게 해줍니다.

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

JWT는 크게 세 부분으로 구성됩니다:

Header.Payload.Signature

🧠 서버는 매 요청마다 JWT의 서명을 확인해서 사용자를 식별합니다.
세션 저장이 필요 없어서 무상태(Stateless) API에 적합합니다!

✅ 장점: 빠르고 세션리스 구조, 모바일/SPA에 최적
❌ 단점: 토큰 탈취 시 위험 → HTTPS 필수, 만료시간 짧게 설정


5) OAuth + JWT = 베스트 조합

요즘 가장 많이 쓰는 조합이
OAuth로 인증하고 JWT로 토큰 발급하여 API를 보호하는 구조입니다.


4. 권한(Authorization) 제어 전략

인증을 넘어서, 다음은 접근 권한을 어떻게 나눌지를 설계해야 해요.

1) Role-based Access Control (RBAC)

  • ROLE_USER: 일반 사용자
  • ROLE_ADMIN: 관리자
  • ROLE_SUPERADMIN: 최상위 관리자

API 호출 전에 다음처럼 검사합니다:

if ($user->role !== 'ROLE_ADMIN') {
    return response('권한 없음', 403);
}

2) Scope 기반 권한

OAuth 2.0에서 자주 쓰이며,
권한을 세분화하여 특정 API만 접근 가능하게 만듭니다.

{
  "scope": "read:profile write:post"
}

🔒 “읽기만 가능, 쓰기는 안 돼요!” 같은 제한이 가능합니다.


5. 추가 보안 강화 기법

✅ HTTPS 필수

API 통신은 반드시 HTTPS로 보호해야 합니다.
평문 통신(HTTP)은 중간자 공격에 너무 취약해요.


✅ Rate Limiting (요청 수 제한)

악성 클라이언트가 API를 무한 요청하는 걸 방지하기 위해
IP나 사용자별 요청 수 제한을 두세요.

if ($requestCount > 1000/hour) {
    return response('Too Many Requests', 429);
}

✅ CORS 설정

API 서버는 외부 도메인에서 오는 요청에 대해 교차 출처 정책(CORS) 설정이 필요해요.

Access-Control-Allow-Origin: https://your-frontend.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE

✅ 로그 기록 및 모니터링

모든 API 호출은 시간, IP, 사용자 정보, 요청 결과 등을 로깅해서

  • 이상 트래픽 감지
  • 보안 사고 추적
    이 가능하도록 해주세요.

주의할 점 정리 ✅

항목 주의사항
API Key는 노출 주의 공개 저장소(GitHub)에 올리지 말기
JWT 만료시간 설정 너무 길면 위험, 너무 짧으면 불편
HTTPS 적용 필수 인증이 있어도 암호화 없으면 의미 없음
인증 실패 처리 401 Unauthorized, 403 Forbidden 구분 정확히
민감 정보 필터링 응답에 비밀번호, 키 등 포함되지 않도록 주의

마무리하며 😊

웹 API는 현대 웹서비스의 심장입니다.
그만큼 보안은 사소한 것이 아니라, 서비스의 신뢰를 결정하는 핵심 요소예요.

  • 인증은 “누구세요?”
  • 권한은 “이걸 할 수 있나요?”
  • 보안은 “당신이 안전한가요?”

이 세 가지를 명확하게 구분하고, 상황에 맞는 인증 방식을 선택해보세요!

다음 시간에는 OAuth 2.0 인증 흐름을 실전 예제로 구현하는 방법을 알려드릴게요.
오늘도 안전하고 지혜로운 개발자 되시길 바랍니다! 🛡️💻🔐

답글 남기기