- snake_case
- Python, DB Table, Column에 사용
- 문자와 문자 사이를
_언더바로 연결- 모든 단어는 소문자이거나 대문자
- camelCase
- Java, JavaScript, TypeScript에서는 변수, 함수, 메서드를 만들때 사용
- 문자와 문자 사이를 대문자로 연결
- PascalCase
- 대부분의 프로그래밍 언어에서 클래스 이름을 지정하는데 사용
- 문자의 처음 시작은 대문자
- 문자와 문자 사이를 대문자로 연결
- kebab-case
- 문자와 문자 사이를
-대시로 연결- 모든 단어는 소문자
클라이언트와 서버가 통신할 때 사용하는 데이터 양식으로서, 언어에 관계 없이 통일된 데이터를 주고 받을 수 있도록 함
- 사람, 컴퓨터 모두 이해하기 쉬우며 용량이 작음
- XML을 대체해서 데이터 전송 등에 많이 사용됨
- Web에서는 JSON을 공통어처럼 사용
snake_case,camelCase모두 사용 가능key-value형태로 구성null, number, string, array, object, boolean형태의 데이터 사용 가능{ "user": [ { "first_name": "gildong", "last_name": "Hong", "age": 100, "phone_agree": false, "hobby": ["Java", "Spring"] }, { "firstName": "younghee", "lastName": "Kim", "age": 200, "phone_agree": true, "hobby": ["React", "Spring", "Node"] }, ] }
서버의 성능 향상을 위한 방법
- Scale Up (수직적 확장)
- 단일 서버의 하드웨어의 사용을 높임 (CPU, 메모리 등의 스펙을 높임)
- 요청에 대한 처리를 더욱 빠르게 할 수 있도록 함
- Scale Out (수평적 확장)
- 같은 사양의 서버(인스턴스)를 여러 대 배치함
- 동시에 더 많은 사용자 요청을 처리할 수 있도록 함
클라이언트와 서버 간의 통신 상태(state) 유지 여부에 따라 나뉘는 특성
- Stateful(상태 유지)
- 클라이언트의 상태를 유지
- 서버는 클라이언트의 요청들을 기억(상태 유지)하여 다음 처리가 가능
- 같은 서버가 유지되어야 하기 때문에 요청 트래픽이 몰리게 되면, 상태를 유지하는 것에 많은 리소스가 소모됨
- 리소스가 버티지 못하면 서버가 종료되거나 다음 요청에 대한 처리가 느려짐
- Stateless(무상태)
- 클라이언트의 상태를 유지하지 않음
- 같은 서버를 유지할 필요가 없으며, 수평 확장성(Scale Out)이 높음
- 클라이언트가 데이터를 추가적으로 전송해야하기 때문에 전송되는 데이터의 양이 많아짐
💡 Web Application을 만들 때 서버의 확장성을 고려하여 최대한 Stateless하게 만들어야 하지만, 로그인과 같은 상태를 유지해야 하는 경우가 발생함. 이런 문제는
Cookie,Session,Token등을 활용하여 극복함.
클라이언트와 서버 간의 연결(Connection) 유지 여부에 따라 나뉘는 특성
- Connection(연결)
- 서버는 클라이언트와의 연결을 유지하기 위해 자원을 소모함
- 클라이언트 2, 3에게서 아무런 요청이 없어도 연결을 유지
- 새로운 연결 과정을 거치지 않아도 되기 때문에 요청에 대한 응답 속도가 빠름
- 클라이언트가 지속적으로 요청을 보낼거라는 보장이 없기 때문에 연결을 위한 자원이 낭비됨
![]()
Connectionless(비연결)
- 서버는 클라이언트와 연결을 유지하지 않음 때문에 최소한의 자원만 사용함
- 서버는 최소한의 자원만 사용하기 때문에 자원을 효율적으로 사용할 수 있음
- 추가적인 요청이 오게 되면 연결(3 Way HandShake)를 새로 해야하기 때문에 응답 시간이 증가함
- 웹 사이트의 정적 자원(HTML, CSS, JS, ...)을 다시 다운로드 해야함
💡 임시 저장(캐시,브라우저 캐싱)을 활용하여 극복
- 현재는 HTTP 지속 연결(Persistent Connections)로 문제를 해결
HTTP 지속 연결(Persistent Connections)
- 하나의 요청에 필요한 요청들이 모두 응답될 때까지 연결을 유지
- 연결을 한번만 맺고 끊기 때문에 속도가 향상됨(Connectionless보다 연결 횟수가 적음)
- 표현 헤더(Representation)
- 리소스에 대한 표현 정보(어떤 데이터 형식으로 보낼지)를 나타냄
- 요청, 응답에 모두 사용
- 종류
- Content-Type : 데이터의 미디어 타입, 문자 인코딩
- Content-Encoding : 압축 방식
- Content-Language : 데이터의 언어 타입
- Content-Length : 데이터 길이(byte 단위)
✅ 실제로는 표현 헤더가 아닌, 페이로드(Payload) 헤더
- 컨텐츠 협상(Content Negotiation)
- 클라이언트가 선호하는 표현을 요청
- 요청시에만 사용되며, 우선 순위가 존재
Quality Values, 줄여서 q 값을 사용- 0 ~ 1 사이의 값으로 1에 가까울수록 우선순위가 높으며, 1인 경우는 생략이 가능
- 서버에서 지원 가능하다면, 우선순위를 기반으로 응답 데이터를 표현
- q가 생략되었다면 선언된 순서대로 우선순위를 가지며, 구체적으로 선언된 것이 우선 순위가 높음
- ex)
Accpet: text/*, text/plain, text/plain;format=flowed, */*text/plain;format=flowed⇒text/plain⇒text/*⇒*/*- 종류
- Accept : 선호하는 미디어 타입
- Accept-Charset : 선호하는 문자 인코딩
- Accept-Encoding : 선호하는 압축 인코딩
- Accept-Language : 선호하는 언어
- 일반 정보
- 단순한 정보들을 나타냄
- 종류
- Referer : 현재 요청된 페이지의 이전 웹 페이지 주소
- 유입 경로를 파악할 수 있으며 요청시 사용
- User-Agent : 클라이언트 애플리케이션 정보(PC, Mobile 브라우저)
- 어떤 환경에서 접속하는지, 문제가 발생하는지 파악 가능하며 요청시 사용
- Server : 요청을 처리하는 ORIGIN 서버의 Software 정보
- 응답에서 사용
- Date : HTTP 요청이 발생한 날짜와 시간
- 응답에서 사용
- 특별 정보
- 종류
- Host : 요청한 도메인 정보
- 필수적으로 포함해야하며, 요청시 사용
- Location : 생성된 리소스 URI, 리다이렉트 주소
- 응답코드 3xx와 함께 응답되면 리다이렉트 주소를 의미
- 응답코드 201(Created)와 함께 응답되면 생성된 리소스의 URI를 의미
- Allow : 허용 가능한 HTTP Method
- 405 (Method Not Allowed) 응답과 함께 사용
- Retry-After : 다음 요청까지 대기 해야하는 시간
- 503 (Service Unavailable)와 함께 서비스가 언제까지 사용이 불가한지 알려줌
- 초단위, 날짜단위 모두 표현 가능
- 인증
- 종류
- Authorization : 클라이언트 인증 정보
- 선택한 인증 방법에 따라 Value 작성
- WWW-Authenticate : 리소스에 필요한 인증 방법
- 401 (Unauthorized) 응답과 함께 사용
- Cookie
- HTTP는 Stateless 특성을 가지고 있기 때문에 매번 상태를 보내주어야하는데 Cookie를 사용하여 해결
- 사용자 세션 관리, 광고 정보 트래킹에 많이 사용
- 종류
- Set-Cookie : 서버에서 응답시 클라이언트로 Cookie 값 전달
- 만료기간(expire, max-age), 사용될 위치(domain, path) 설정 가능
⚠️ 항상 서버에 전달되므로 최소한의 정보만 사용하여 트래픽을 최적화 시켜야 함
⚠️ 탈취 당하기 쉬우니 보안에 민감한 정보는 저장하지 않음- Cookie : 클라이언트가 서버에서 받은 쿠키를 Cookie 헤더를 통해 전송한다.
- Secure : https인 경우에만 쿠키를 전송
- 기본적으로는 http, https 구분하지 않고 쿠키를 전송
- HttpOnly : http 전송에만 사용한다.
- 자바스크립트에서 쿠키를 접근하지 못하게 함
- SameSite : 쿠키에 설정된 도메인이 같은 경우만 쿠키를 전송
- Cache
- 캐시가 없다면 같은 요청에 대한 응답 데이터가 같아도 매번 데이터를 새로 다운 받아야 함
- 새로 다운 받는만큼 속도가 느려지고, 비용이 발생함
- 종류
- Cache-Control
- 응답시 사용
- Cache-Control:
max-age
- 캐시 유효 시간(초)
- 캐시 유효 시간이 지나면 다시 서버를 통해 데이터를 응답받고 캐시를 갱신
- Cache-Control:
no-cache
- 캐시 가능한 데이터지만, 서버에 검증하고 사용해야함
- Cache-Control:
no-store
- 보안에 민감한 데이터로서 캐시하지 않음
- if-modified-since : 캐시로 저장된 데이터 최종 수정일
- 요청시 사용
- Last-Modified : 데이터가 마지막으로 수정된 시간
- if-modified-since 요청이 오면 응답
- 304 (Not Modified) 상태코드와 함께 응답되면 수정되지 않았다는 것을 의미
- ETag : 캐시용 데이터에 날짜, 시간이 아닌 이름을 지정
- if-modified-since + Last-Modified 방식은 수정된 데이터가 같거나 캐시가 불필요한 경우를 구분하지 못함
- 요청시 사용