brunch

You can make anything
by writing

C.S.Lewis

by florent Jul 10. 2024

API

florent의 개발 적응기




이 글의 주요 내용

[API (Application Programming Interface, 응용 프로그래밍 인터페이스)]

[JSON (JavaScript Object Notation)]

[서버 측 API 요청(Server-side API Request)]

[Node.js에서 API 요청 수행하기]

[API 인증]

[보안]




[API (Application Programming Interface, , 응용 프로그래밍 인터페이스)]


[API란?]

API는 서로 다른 소프트웨어 시스템 간의 통신을 가능하게 하는 도구

API는 한 프로그램이 다른 프로그램의 기능이나 데이터에 접근할 수 있도록 하는 명세를 제공

개발자가 복잡한 기능을 쉽게 구현할 수 있게 해주며, 소프트웨어 개발 과정을 단순화함



[API의 역할]

요청과 응답의 형식을 정의

데이터의 구조와 타입을 명시

사용 가능한 함수나 메서드를 설명

에러 처리 방법을 제공



[API의 아키텍처 스타일 종류]


(1) REST (Representational State Transfer)

가장 널리 사용되는 API 아키텍처 스타일로, HTTP 프로토콜을 기반으로 함

리소스에 대한 CRUD(Create, Read, Update, Delete) 작업을 HTTP 메서드를 통해 수행


(2) GraphQL

Facebook에서 개발한 쿼리 언어 및 런타임으로, 클라이언트가 필요한 데이터를 정확히 요청할 수 있게 해줌

단일 엔드포인트를 사용하며, 오버페칭과 언더페칭 문제를 해결


(3) SOAP (Simple Object Access Protocol)

XML 기반의 메시징 프로토콜로, 분산 환경에서의 정보 교환에 사용

보안과 신뢰성이 중요한 엔터프라이즈 환경에서 주로 사용


(4) gRPC (gRPC Remote Procedure Call)

Google에서 개발한 고성능 RPC(Remote Procedure Call) 프레임워크

Protocol Buffers를 사용하여 데이터를 직렬화하며, HTTP/2를 기반으로 합니다.



[API의 접근성과 사용 범위]



[API 요청의 구조와 기술적 세부사항]


(1) API 엔드포인트 (API Endpoint): API에 접근하기 위한 특정 URL

구조: BaseURL/Endpoint

RESTful API에서는 리소스를 나타내는 명사 형태로 구성, HTTP 메서드(GET, POST, PUT, DELETE 등)와 결합하여 작업 정의

예시: https://api.example.com/users (사용자 리소스), https://api.example.com/products (제품 리소스)


(2) API 쿼리 매개변수 (Query Parameters): URL의 끝에 추가되는 키-값 쌍

구조: ?key1=value1&key2=value2

선택적 정보를 전달하는 데 사용, URL 인코딩 필요 (예: 공백은 %20으로 인코딩)

주요 용도: 필터링(ex. ?category=electronics), 정렬 (ex. ?sort=price_asc), 페이지네이션 (ex. page=2&limit=20)

예시: https://api.example.com/products?category=electronics&sort=price_asc


(3) API 경로 매개변수 (Path Parameters): URL 경로의 일부로 포함되는 변수

구조: /resource/{parameter}

주로 특정 리소스를 식별하는 데 사용

RESTful API에서 자주 사용되는 패턴

주요 용도: 특정 항목 조회(ex. /users/{user_id}), 계층적 리소스 표현(ex. /departments/{dept_id}/employees/{emp_id})

예시: https://api.example.com/users/12345


(5) 요청 헤더 (Request Headers): HTTP 요청에 포함되는 메타데이터

Authorization: 인증 토큰이나 API 키 전달

Content-Type: 요청 본문의 미디어 타입 지정

Accept: 클라이언트가 받아들일 수 있는 응답 형식 지정

예시


(6) 요청 본문 (Request Body): HTTP 요청에 포함되는 데이터

주로 JSON (JavaScript Object Notation), XML (eXtensible Markup Language), Form data 형태

예시 (JSON)



[RESTful API의 특징]


(1) 표준 HTTP 메서드 사용: GET, POST, PUT, PATCH, DELETE ⇒ 이러한 표준 메서드를 사용함으로써 API의 일관성과 예측 가능성을 높임


(2) 표준 데이터 형식 사용: JSON (JavaScript Object Notation)이나 XML (eXtensible Markup Language) 등을 사용 ⇒ 이는 'REpresentational State Transfer'의 '표현(Representational)' 부분을 구현하며, 클라이언트와 서버 간 데이터 교환을 표준화하고 간소화


(3) 클라이언트-서버 분리: 클라이언트와 서버가 독립적으로 개발될 수 수 있게 함 ⇒ 각 부분을 독립적으로 확장 가능 + 전체 시스템의 확장성과 유연성 향상


(4) 무상태성 (Statelessness): 각 요청은 자체적으로 완결되어야 함 ⇒ 서버는 클라이언트의 상태를 저장하지 않으며, 세션 정보 등은 클라이언트 측에서 관리 → 서버의 확장성을 높이고 복잡성을 줄임


(4) 리소스 기반 구조: 모든 것을 '리소스'로 모델링하며 각 리소스는 고유한 식별자(URI)를 가짐, 리소스에 대한 조작은 HTTP 메서드를 통해 수행


(5) 계층화된 시스템 (Layered System): 클라이언트는 서버의 내부 구조를 알 필요가 없음 → 중간 계층(로드 밸런서, 캐시 등)을 추가하여 확장성과 보안성 향상 가능


(6) 캐시 가능성 (Cacheability): 응답은 캐시 가능 여부를 명시해야 함 ⇒ 클라이언트 측 캐싱을 통해 서버 부하 감소 및 성능 향상




[JSON (JavaScript Object Notation)]


[JSON이란?]

데이터를 저장하고 전송하기 위한 경량의 텍스트 기반 데이터 교환 형식

인터넷을 통해 데이터를 전송하는 데 많이 사용됨

JSON은 자바스크립트 객체를 평탄화하여 큰 객체를 효율적으로 전송할 수 있게 함

복잡한 구조의 경우 인간이 읽기 어려울 수 있으므로, JSON 시각화 도구 사용 권장


[JSON의 구조]

키-값 쌍의 컬렉션 ({})


순서화된 값의 목록 ([])


[JSON의 데이터 타입]

문자열 (string)

숫자 (number)

불리언 (boolean)

객체 (object)

배열 (array)

null



[JSON vs JavaScript 객체]

JSON

JavaScript 객체


[JSON ↔ JavaScript 변환]

JavaScript 객체를 JSON으로: JSON.stringify()

JSON을 JavaScript 객체로: JSON.parse()




[서버 측 API 요청(Server-side API Request)]


[서버 측 API 요청이란?]

서버 측 API 요청은 웹 서버가 다른 서버의 API에 데이터를 요청하는 과정

외부 서비스의 데이터 가져오기, 마이크로서비스 아키텍처에서 서비스 간 통신, 서드파티 API와의 통합 등의 상황에서 사용


[Node.js에서 API 요청 수행하기]

(1) 내장 'https' 모듈 사용

Node.js 내장 모듈로 추가 설치 불필요

낮은 수준의 API 제공, 더 많은 코드 작성 필요

스트리밍 방식으로 데이터 처리 가능


(2) 'Axios'와 같은 서드파티 라이브러리 사용

간단하고 직관적인 API 제공

Promise 기반으로 비동기 처리 용이

자동으로 JSON 파싱 수행



[API 인증]


[인증(Authentication)과 인가(Authorization)]


[API 인증 방법]




[보안]


[사용자 인증 기본 (User Authentication Basics)]

사용자 인증은 시스템에 접근하려는 사용자의 신원을 확인하는 과정 ⇒ 가장 기본적인 형태는 이메일과 비밀번호를 사용하는 방식

사용자 등록 (User Registration): 새로운 사용자의 정보를 시스템에 저장하는 과정

로그인 (Login): 저장된 정보와 사용자가 제공한 정보를 비교하여 인증하는 과정


[비밀번호 보안 (Password Security)]

암호화 (Encryption): 양방향 변환 과정으로, 암호화된 데이터를 원래 형태로 복호화할 수 있음

해싱 (Hashing): 단방향 변환 과정으로, 원본 데이터를 복구할 수 없는 형태로 변환

솔팅 (Salting): 해시 함수에 추가적인 무작위 데이터를 더하여 해시의 강도를 높이는 기법


[비밀번호 해킹과 방어 (Password Hacking and Defense)]

무차별 대입 공격 (Brute Force Attack): 가능한 모든 조합을 시도하는 공격

사전 공격 (Dictionary Attack): 자주 사용되는 비밀번호 목록을 사용하는 공격

방어 기법: 강력한 비밀번호 정책, 로그인 시도 제한, 다단계 인증 등


[세션 관리 (Session Management)]

사용자의 인증 상태를 유지하기 위해 세션을 사용

쿠키 (Cookies): 클라이언트 측에 저장되는 작은 데이터 조각

세션 (Sessions): 서버 측에서 유지되는 사용자별 데이터 저장소

토큰 기반 인증 (Token-based Authentication): JWT(JSON Web Tokens) 등을 사용한 인증 방식


[환경 변수와 보안 (Environment Variables and Security)]

.env 파일: 환경 변수를 저장하는 파일

환경 변수 사용: 데이터베이스 연결 정보, API 키, 비밀 키 등을 환경 변수로 관리


[OAuth와 소셜 로그인 (OAuth and Social Login)]

타사 서비스를 통한 인증을 구현하는 방법

OAuth 프로토콜: 사용자 데이터에 대한 접근 권한을 부여하는 표준 프로토콜

Google OAuth: Google 계정을 사용한 로그인 구현

다른 소셜 로그인: Facebook, Twitter 등 다양한 플랫폼과의 통합


작가의 이전글 React.js
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari