REST API

API

APIλŠ” Application Programming Interface의 μ•½μžλ‘œ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν• μˆ˜ μžˆλ„λ‘, μš΄μ˜μ²΄μ œλ‚˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ œμ–΄ν•  수 있게 λ§Œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λœ»ν•œλ‹€.주둜 파일 μ œμ–΄, μ°½ μ œμ–΄, 화상 처리, 문자 μ œμ–΄ λ“± μžμ‹ μ΄ μ›ν•˜λŠ” κΈ°λŠ₯을 μ œμ–΄ν•  수 μžˆλ„λ‘ ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€. λ”°λΌμ„œ μ›ν•˜λŠ” κΈ°λŠ₯을 μ œμ–΄ν•˜λŠ” APIλ₯Ό 직접 λ§Œλ“€ μˆ˜λ„ μžˆλ‹€.​

Web API

μ›Ή μ„œλ²„ λ˜λŠ” μ›Ή λΈŒλΌμš°μ €λ₯Ό μœ„ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. HTTP μ„œλΉ„μŠ€μ΄κ³  λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 접근이 κ°€λŠ₯ν•˜λ„λ‘ μ„€κ³„λ˜μ–΄μžˆλ‹€. Web ν™˜κ²½μ„ 톡해 μ œκ³΅λ˜λŠ” 데이터 CRUD μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.HTTP ν‘œμ€€ μ ‘κ·Ό 방식을 μ΄μš©ν•˜λ©° ν”Œλž«νΌ ν™˜κ²½, ν΄λΌμ΄μ–ΈνŠΈ ν™˜κ²½μ˜ μ œν•œμ΄ μ—†λŠ” μ„œλΉ„μŠ€ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

REST

RESTλŠ” Representational State Transfer의 μ•½μžμ΄λ‹€. μžμ›μ„ URI둜 ν‘œμ‹œν•˜κ³  ν•΄λ‹Ή μžμ›μ˜ μƒνƒœλ₯Ό μ£Όκ³  λ°›λŠ” 것을 μ˜λ―Έν•œλ‹€. RESTλŠ” ν”„λ‘œν† μ½œμ΄λ‚˜ ν‘œμ€€μ΄ μ•„λ‹Œ μ•„ν‚€ν…μ²˜ 원칙 μ„ΈνŠΈμ΄λ©° API κ°œλ°œμžλŠ” RESTλ₯Ό λ‹€μ–‘ν•œ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

REST의 κ΅¬μ„±μš”μ†Œ

μžμ›(Resource): URI

  • λͺ¨λ“  μžμ›μ— κ³ μœ ν•œ IDκ°€ μ‘΄μž¬ν•˜κ³ , 이 μžμ›μ€ Server에 μ‘΄μž¬ν•œλ‹€.

  • μžμ›μ„ κ΅¬λ³„ν•˜λŠ” IDλŠ” /orders/order_id/1 와 같은 HTTP URI 이닀.

ν–‰μœ„(Verb): HTTP Method

  • HTTP ν”„λ‘œν† μ½œμ˜ Methodλ₯Ό μ‚¬μš©ν•œλ‹€.

  • HTTP ν”„λ‘œν† μ½œμ€ GET, POST, PUT, DELETE와 같은 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

ν‘œν˜„(Representations) : HTTP Message Payload

  • Clientκ°€ μžμ›μ˜ μƒνƒœ (정보)에 λŒ€ν•œ μ‘°μž‘μ„ μš”μ²­ν•˜λ©΄ ServerλŠ” 이에 μ μ ˆν•œ 응닡 (Representation)을 보낸닀.

  • RESTμ—μ„œ ν•˜λ‚˜μ˜ μžμ›μ€ JSON, XML, TEXT, RSS λ“± μ—¬λŸ¬ ν˜•νƒœμ˜ Representation으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. (ν˜„μž¬λŠ” JSON으둜 μ£Όκ³  λ°›λŠ” 것이 λŒ€λΆ€λΆ„μ΄λ‹€.)

λ”°λΌμ„œ, RESTλŠ” URIλ₯Ό 톡해 μžμ›μ„ ν‘œμ‹œν•˜κ³  HTTP METHODλ₯Ό μ΄μš©ν•˜μ—¬ ν•΄λ‹Ή μžμ›μ˜ ν–‰μœ„λ₯Ό μ •ν•΄μ£Όλ©° κ·Έ κ²°κ³Όλ₯Ό λ°›λŠ” 것을 λ§ν•œλ‹€.

REST의 CRUD λ©”μ„œλ“œ

Method

CRUD

SQL

μ„€λͺ…

POST

Create

INSERT

생성

GET

Read

SELECT

읽기

PUT

Update

UPDATE

κ°±μ‹ 

DELETE

Delete

DELETE

μ‚­μ œ

​

RESTful

RESTλ₯Ό RESTλ‹΅κ²Œ μ“°κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ 곡식적이지 μ•Šμ€ κ°œλ°œμžλ“€μ΄ λΉ„κ³΅μ‹μ μœΌλ‘œ μ œμ‹œν•œ 것이닀. μ΄ν•΄ν•˜κΈ° 쉽고 μ‚¬μš©ν•˜κΈ° μ‰¬μš΄ REST APIλ₯Ό λ§Œλ“œλŠ” 것이 λͺ©μ .HTTP와 URI 기반으둜 μžμ›μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ μ œκ³΅ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 기본적으둜 κ°œλ°œμžλŠ” HTTP λ©”μ†Œλ“œμ™€ URI 만으둜 인터넷에 자료λ₯Ό CRUD ν•  수 μžˆλ‹€.

  • CRUD의 κΈ°λŠ₯을 μ „λΆ€ ν™œμš©ν•΄μ•Όν•œλ‹€. (예. POST둜만 λͺ¨λ“  것을 μ²˜λ¦¬ν•˜λ©΄ RESTful이 μ•„λ‹ˆλ‹€.)

  • URI에 resourceκ³Ό idμ™Έ μ •λ³΄λ§Œ λ“€μ–΄κ°€μ•Όν•œλ‹€. (예. "/students/updateName"은 RESTful이 μ•„λ‹ˆλ‹€.)

μžμ„Έν•œ μ„€λͺ…은 μ•„λž˜ μ‚¬μ΄νŠΈ μ°Έκ³ 

URL vs URI

[URL]

  • ν”„λ‘œν† μ½œ: http, https, ftp λ“±

  • ν˜ΈμŠ€νŠΈλ„€μž„: 도메인 or IP (μ„œλ²„μ»΄ν“¨ν„°μ˜ 이름 - μœ„μΉ˜)

  • URL path: μ„œλ²„μ»΄ν“¨ν„°(host)μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ 파일 디렉토리

  • 쿼리: 좔가적 μ§ˆλ¬Έμ‚¬ν•­

[URI]

  • Identifier: μ‹λ³„μž, μžμ› μ‹λ³„μž, idκ°’(index)

  • URIκ°€ URL을 포함

  • μ˜ˆμ‹œ: http://localhost/article/7 -> article(예λ₯Ό λ“€μ–΄ db ν…Œμ΄λΈ” 이름)μ΄λΌλŠ” db에 μ €μž₯된 데이터 7번째 것을 λ‚˜νƒ€λƒ„

즉, URL은 μ„œλ²„μ»΄ν“¨ν„°μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ 파일의 디렉토리λ₯Ό λ‚˜νƒ€λ‚΄μ§€λ§Œ URIλŠ” μžμ›μ˜ 고유 μ‹λ³„μž(idκ°’)이닀.​

Authorize

전톡적인 인증 μ‹œμŠ€ν…œ

  1. 1.μœ μ €κ°€ ID/PW λ₯Ό μž…λ ₯ν•œλ‹€. (POST /authenticate username=***&password=***)

  2. 2.μ„œλ²„λŠ” request κ°€ λ“€μ–΄μ˜€λ©΄ μ—°λ™λœ 계정 DBλ₯Ό μΏΌλ¦¬ν•˜μ—¬ μœ μ €λ₯Ό κ²€μ¦ν•˜κ³ , μœ νš¨ν•œ μœ μ €λΌλ©΄ μ„Έμ…˜μ„ μƒμ„±ν•˜κ³  μ„Έμ…˜ 정보λ₯Ό response 헀더에 ν¬ν•¨μ‹œμΌœ λ°˜ν™˜ν•œλ‹€.

  3. 3.ν΄λΌμ΄μ–ΈνŠΈλŠ” μ œν•œλœ end points 에 μ ‘κ·Όν•  λ•Œ λͺ¨λ“  request header 에 λ°˜ν™˜λ°›μ€ μ„Έμ…˜ 정보λ₯Ό ν¬ν•¨μ‹œν‚¨λ‹€.

  4. 4.λ§Œμ•½ μ„Έμ…˜ 정보가 μœ νš¨ν•˜λ©΄, μ„œλ²„λŠ” μœ μ €κ°€ νŠΉμ • end point 에 μ ‘κ·Όν•˜λŠ” 것을 ν—ˆμš©ν•˜κ³  λ Œλ”λ§λœ HTML λ‚΄μš©μ„ λ°˜ν™˜ν•œλ‹€.

μ΄λŸ¬ν•œ 전톡적인 인증 μ‹œμŠ€ν…œμ€ λ¬Έμ œκ°€ μ—†μ—ˆλ‹€. μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 잘 λ™μž‘ν•˜κ³ , μ‚¬μš©μž 인증을 거쳐 νŠΉμ • end point 둜의 접근을 μ œν•œν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 전톡적인 인증 λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λ°”일 ν΄λΌμ΄μ–ΈνŠΈ(μ•ˆλ“œλ‘œμ΄λ“œ λ“±)μ—μ„œ λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” λ¬Έμ œκ°€ μžˆλ‹€. μ΄μœ λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • μ„Έμ…˜κ³Ό μΏ ν‚€λŠ” λͺ¨λ°”일 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ make sense ν•˜μ§€ μ•Šλ‹€. μ„œλ²„μ—μ„œ μƒμ„±λœ μ„Έμ…˜κ³Ό μΏ ν‚€λ₯Ό λͺ¨λ°”일 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” κ³΅μœ ν•  수 μ—†λ‹€.

  • ν˜„μž¬ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ Œλ”λ§λœ HTML 이 λ°˜ν™˜ λ˜μ—ˆμœΌλ‚˜, λͺ¨λ°”일 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” JSON λ˜λŠ” XML κ³Ό 같은 포맷의 응닡이 ν•„μš”ν•˜λ‹€.

즉 μ΄λŸ¬ν•œ 경우, ν΄λΌμ΄μ–ΈνŠΈ 독립적인 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”ν•˜λ‹€. (ν΄λΌμ΄μ–ΈνŠΈμ˜ μ’…λ₯˜μ— 따라 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” 것이 μ•„λ‹ˆλΌ, ν΄λΌμ΄μ–ΈνŠΈμ˜ μ’…λ₯˜μ— 상관없이 λ™μΌν•œ λ™μž‘μ„ ν•  수 μžˆλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•„μš”ν•˜λ‹€λŠ” μ˜λ―Έμ΄λ‹€. )​

토큰 기반 인증 μ‹œμŠ€ν…œ

토큰 기반 μΈμ¦μ—μ„œλŠ” 쿠킀와 μ„Έμ…˜μ΄ μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€. 토큰은 μ„œλ²„λ‘œμ˜ λͺ¨λ“  request 에 λŒ€ν•΄ μœ μ €λ₯Ό μΈμ¦ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. 전톡적인 인증 μ‹œμŠ€ν…œμ—μ„œμ˜ 인증 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό 토큰 기반 인증 μ‹œμŠ€ν…œμœΌλ‘œ μž¬μ„€κ³„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  1. 1.μœ μ €κ°€ ID/PW λ₯Ό μž…λ ₯ν•œλ‹€ (POST /authentication username=***&password=***)

  2. 2.μ„œλ²„λŠ” request κ°€ λ“€μ–΄μ˜€λ©΄ μ—°λ™λœ 계정 DBλ₯Ό μΏΌλ¦¬ν•˜μ—¬ μœ μ €λ₯Ό κ²€μ¦ν•˜κ³ , μœ νš¨ν•œ μœ μ €λΌλ©΄ 토큰을 μƒμ„±ν•˜κ³  토큰 정보λ₯Ό response 헀더에 ν¬ν•¨μ‹œμΌœ λ°˜ν™˜ν•œλ‹€. 이둜 인해, μœ μ €λŠ” local storage 에 토큰을 μ €μž₯ν•  수 μžˆλ‹€.

  3. 3.ν΄λΌμ΄μ–ΈνŠΈλŠ” μ œν•œλœ end points 에 μ ‘κ·Όν•  λ•Œ λͺ¨λ“  request header 에 λ°˜ν™˜λ°›μ€ 토큰 정보λ₯Ό 포함 μ‹œν‚¨λ‹€.

  4. 4.λ§Œμ•½ 토큰 정보가 μœ νš¨ν•˜λ©΄, μ„œλ²„λŠ” μœ μ €κ°€ νŠΉμ • end point 에 μ ‘κ·Όν•˜λŠ” 것을 ν—ˆμš©ν•˜κ³  json λ˜ν•œ xml 포맷으둜 μ‘λ‹΅ν•œλ‹€.

토큰 기반 인증 μ‹œμŠ€ν…œμ˜ 예제 μŠ€ν‚€λ§ˆλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. 1.μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ λͺ¨λ°”일 ν΄λΌμ΄μ–ΈνŠΈ λ“±μ—μ„œ API 에 λŒ€ν•œ request κ°€ μƒμ„±λœλ‹€.

  2. 2.request λŠ” μ„œλΉ„μŠ€λ‘œ 전달 되고, λ§Žμ€ request κ°€ μƒμ„±λ˜λ©΄ λ‹€μˆ˜ μ„œλ²„κ°€ ν•„μš”ν•˜λ‹€.

  3. 3.λ‹€μˆ˜ μ„œλ²„ 쀑 κ°€μž₯ μ ν•©ν•œ μ„œλ²„λ‘œ request λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ LB(Load Balencer)κ°€ μ‚¬μš©λœλ‹€. request κ°€ λ°œμƒν•˜λ©΄, LB κ°€ request λ₯Ό μ œμ–΄ν•˜κ³  νŠΉμ • μ„œλ²„(κ°€μž₯ μ ν•©ν•œ)둜 request λ₯Ό redirect μ‹œν‚¨λ‹€.

  4. 4.ν•˜λ‚˜μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ—¬λŸ¬ μ„œλ²„λ‘œ λ°°μΉ˜λœλ‹€. request κ°€ 생성될 λ•Œλ§ˆλ‹€ λ°±μ—”λ“œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ request header λ₯Ό κ°€λ‘œμ±„μ„œ authentication header λ‚΄μ˜ 토큰 정보λ₯Ό μΆ”μΆœν•΄λ‚΄κ³ , DB μΏΌλ¦¬λŠ” ν•΄λ‹Ή 토큰을 μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰λœλ‹€. λ§Œμ•½ 토큰이 μœ νš¨ν•˜κ³  end point μ ‘κ·Ό κΆŒν•œμ„ κ°€μ§€κ³  μžˆλ‹€λ©΄ μ„œλΉ„μŠ€κ°€ 제곡되고, κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ 403 response (forbidden status) λ₯Ό λ°˜ν™˜ν•œλ‹€.

​

ETC

HTTP Response Code

2xx 성곡

  • 200: ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ μ •μƒμ μœΌλ‘œ μˆ˜ν–‰ν•¨.

  • 201: ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 생성 μž‘μ—…μ„ μš”μ²­ λ°›μ•˜κ³ , 생성 μž‘μ—…μ„ 성곡함.

  • 204: μš”μ²­μ€ 성곡 ν–ˆμ§€λ§Œ 응닡할 μ½˜ν…μΈ κ°€ μ—†μŒ.

3xx λ¦¬λ‹€μ΄λ ‰μ…˜

  • 301: ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ URIκ°€ 영ꡬ적으둜 λ³€κ²½λ˜μ—ˆμ„ λ•Œ μ‚¬μš©ν•¨.

  • 302: 301κ³Ό κ°™μœΌλ‚˜ μž„μ‹œμ μœΌλ‘œ μ£Όμ†Œκ°€ λ°”λ€Œμ—ˆμ„ 경우 μ‚¬μš©ν•¨.

  • 304: 이전에 λ°©λ¬Έν–ˆμ„ λ•Œμ˜ μš”μ²­ 결과와 λ‹€λ₯΄μ§€ μ•Šμ„ 경우 μ‚¬μš©ν•¨. μΊμ‹œλœ νŽ˜μ΄μ§€λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©.

  • 307: μž„μ‹œ νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈ.

4xx ν΄λΌμ΄μ–ΈνŠΈ 였λ₯˜

  • 400: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ˜¬λ°”λ₯΄μ§€ λͺ»ν•œ μš”μ²­μ„ 보냄.

  • 401: λ‘œκ·ΈμΈμ„ ν•˜μ§€ μ•Šμ•„ νŽ˜μ΄μ§€λ₯Ό μ—΄ κΆŒν•œμ΄ μ—†μŒ.

  • 403: κΈˆμ§€λœ νŽ˜μ΄μ§€, λ‘œκ·ΈμΈμ„ ν•˜λ“  μ•ˆν•˜λ“  μ ‘κ·Όν•  수 μ—†μŒ. (κ΄€λ¦¬μž νŽ˜μ΄μ§€)

  • 404: 찾을 수 μ—†λŠ” νŽ˜μ΄μ§€, μ£Όμ†Œλ₯Ό 잘 λͺ» μž…λ ₯ν–ˆμ„ λ•Œ μ‚¬μš©ν•¨.

  • 403 λŒ€μ‹ μ— μ‚¬μš©ν•  μˆ˜λ„ 있음.(ν•΄μ»€λ“€μ˜ 곡격을 λ°©μ§€ν•˜κ³ μž νŽ˜μ΄μ§€κ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ μœ„μž₯함)

  • 408: μš”μ²­ μ‹œκ°„μ΄ 초과됨.

  • 409: μ„œλ²„κ°€ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ 좩돌이 λ°œμƒν•œ 경우. (νšŒμ›κ°€μž… 쀑 μ€‘λ³΅λœ 아이디인 경우)

  • 410: 영ꡬ적으둜 μ‚¬μš©ν•  수 μ—†λŠ” νŽ˜μ΄μ§€.

5xx μ„œλ²„ 였λ₯˜

  • 501: ν•΄λ‹Ή μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯이 λ§Œλ“€μ–΄μ§€μ§€ μ•ŠμŒ.

  • 502: μ„œλ²„λ‘œ κ°€λŠ₯ μš”μ²­μ΄ μ€‘κ°„μ—μ„œ μœ μ‹€λœ 경우.

  • 503: μ„œλ²„κ°€ ν„°μ‘Œκ±°λ‚˜ μœ μ§€ 보수 쀑 (μœ μ§€ 보수 μ€‘μΌλ•ŒλŠ” μœ μ§€ λ³΄μˆ˜μ€‘μ΄λΌλŠ” 것을 μ•Œλ €μ£ΌλŠ” νŽ˜μ΄μ§€λ‘œ μ „μ†‘ν•΄μ£ΌλŠ” 것이 μ’‹μŒ)

  • 504: μ„œλ²„ κ²Œμ΄νŠΈμ›¨μ΄μ— λ¬Έμ œκ°€ 생겨 μ‹œκ°„ μ΄ˆκ³Όκ°€ 된 경우.

  • 505: HTTP 버전이 달라 μš”μ²­μ΄ μ²˜λ¦¬ν•  수 μ—†μŒ.

​​

Last updated