- 이번 글에서는 Restful 설계 원칙에 대해서 다뤄보겠습니다.
1) URL Rules
(1) 마지막에 / 포함하지 않는다
Bad
http://api.test.com/users/
Good
http://api.test.com/users
(2) _(언더바) 대신 -(대시)를 사용한다
- 단, -(대시)의 사용도 최소한으로 설계한다
Bad
http://api.test.com/users/post_comments
Good
http://api.test.com/users/post-comments
(3) 소문자를 사용한다
Bad
http://api.test.com/users/postComments
Good
http://api.test.com/users/post-comments
(4) 행위(method)는 URL에 포함하지 않는다.
Bad
POST http://api.test.com/users/1/delete-post/1
Good
http://api.test.com/users/1/posts/1
(5) 컨트롤 자원을 의미하는 URL은 예외적으로 동사를 허용한다.
- 함수처럼 컨트롤 리소스를 나타내는 URL은 동작을 포함하는 이름을 짓는다.
2) Set HTTP Headers
(1) Content-Location
- POST 요청은 대부분 idempotent 하지 않다.
즉, 반환되는 응답 리소스의 결과가 항상 동일하지는 않다.
POST /users
{
"name": "hak"
}
- 위와 같은 요청은 매번 다른 리소스를 반환한다.
첫번째는 /users/1, 두번째는 /users/2, ... n번째는 /users/n
따라서 요청의 응답 헤더에 새로 생성된 리소스를 식별할 수 있는 Content-Location 속성을 이용한다.
HTTP/1.1 200 OK
Content-Location: /users/1
- 반면, GET, PUT 등의 요청은 idempotent 하다.
- 이 때, HATEOAS로 Content-Location을 대체할 수 있다.
(2) Content-Type
- application/json을 우선적으로 제공한다.
(3) Retry-After
- 비정상적인 방법(ex)DoS, Brute-force attack)으로 API 서버를 이용하려는 경우, 429 Too Many Requests 오류 응답과 함께 일정 시간 뒤 요청할 것을 나타낸다.
HTTP/1.1 429 Too Many Requests
Retry-After: 3600
(3-1) Case 1. 인증
- /auth : Oauth, JWT 같은 인증 관련 리소스를 요청하는 작업
- /login: Id, Password를 이용한 로그인 작업
- 비정상적인 요청(401)일 때, 두 가지 응답 방안이 있습니다.
(1) n 시간 동안 n회만 요청 가능한 경우
- 429 응답과 함께 Retry-After: n
(2) n 회만 요청 가능한 경우
- 401 응답과 함께 해당 IP는 더 이상 인증 관련 API를 사용할 수 없고, 다시 요청하려면 특수한 절차가 필요하다고 응답
(3-2) Case 2. 자원 요청
- /posts : 특정 사용자가 의도적으로 서버 과부하를 목적으로 반복 요청하는 경우
(1) n 시간 동안 n회 이상 요청한 경우
- 429 응답
참고
'네트워크' 카테고리의 다른 글
OSI 7계층 - 데이터 링크 계층 (0) | 2022.09.01 |
---|---|
OSI 7계층 - 물리 계층 (0) | 2022.08.31 |
base64 인코딩 (0) | 2022.08.17 |
쿠키와 세션 (0) | 2022.08.01 |
TCP vs UDP (0) | 2022.07.31 |