본문 바로가기
더이상 하지 않는 Backend - NodeJS/Node-Express 개론(완)

[O'REILLY] Node & Express - 6장 : 요청과 응답 객체

by VictorMeredith 2023. 3. 20.

1.  URL

URL의 구조와 각 명칭

프로토콜

- 요청을 어떻게 전송할지 결정한다.

- http / https / file / ftp 등이 있다.

 

호스트

- 호스트는 서버이다. 로컬에 있는 서버는 한 단어 또는 숫자 형태의 IP 주소로 표현된다.

- 인터넷에 있는 서버는 .com이나 .net 같은 최상위 도메인으로 끝난다.

- 호스트 이름 앞에 서브도메인(www 등)이 있을 수 있다.

 

포트

- 각 서버에는 숫자 형태의 포트가 있다. 80, 443 같은 일부 포트 번호는 특별한 용도로 쓰인다.

- HTTP에서는 80, HTTPS에서는 443이라고 간주한다. (포트 생략 시)

- 일반적으로 3000, 8080, 8088 같이 기억하기 쉬운 포트 번호를 쓴다. 1023보다 큰 포트를 써야 한다.

- 한 서버에서 포트 번호를 중복으로 사용할 수는 없다.

 

경로

- 옵셔널하지만, 앱에서 사용하는 페이지나 기타 자원은 모두 경로를 통해 유일하게 식별할 수 있어야 한다. (REST)

 

쿼리스트링

- 쿼리스트링은 이름-값 쌍의 컬렉션이며 옵션이다. ?기호로 시작하고, &기호로 구분한다.

- 이름과 값은 모두 URL 인코드를 사용해야 한다.

- JS에는 encodeURIComponent가 있다.

 

해시

- 해시(또는 fragment)는 서버로 전송되지 않으며, 브라우저에서만 사용한다.

- SPA에서는 네비게이션으로 사용되기도 한다. (Hash-Mode)

- 해시의 원래 목적은 요소가 가진 id로 즉시 이동하는 것이다.

 

2. HTTP 요청 메서드

- 가장 많이 쓰는 요청은 GET, POST 이다.

- 브라우저에 URL을 입력하거나 링크를 클릭하면 브라우저는 서버에 HTTP GET 요청을 보낸다.

- 서버로 전달되는 중요 정보는 URL 경로와 쿼리스트링이다. 앱은 메서드, 경로, 쿼리스트링의 조합에 따라 반응하여 응답한다.

- 브라우저는 서버와 통신할 때 GET과 POST 메서드를 우선 사용하나, 앱에서 AJAX 요청을 보낼 때에는 어떤 HTTP라도 사용할 수 있다.

- 보통 GET(읽기), POST(쓰기), PUT(수정), PATCH(일부수정), DELETE(삭제) 등을 사용한다.

 

3. 요청 헤더

- 브라우저는 서버에게 보이지 않는 정보도 많이 보낸다.

- 다음과 같이 express에서 작성하면, 요청에서 보내는 header의 정보를 확인할 수 있다.

 

app.get('/headers', (req, res)=>{
	res.type('text/plain')
    const headers = Object.entries(req.headers)
    .map(([key,value]) => `${key}: ${value})
    res.send(headers.join('\n'))
})

 

4. 응답 헤더

- 브라우저도 보이지 않는 정보를 몰래 보낸다.

- 일반적으로 메타데이터와 서버 정보이다.

- 브라우저는 콘텐츠를 렌더링할 때 Content-Type의 정보를 사용해 렌더링 방법을 결정하기 때문에, 이를 헤더에 담아 보낸다.

- 인코딩 정보, 캐시에 대한 힌트도 들어있다.(웹사이트 최적화에 중요하다.)

- 서버에 관한 정보가 포함될 경우도 많다. (app.disable('x-powered-by) 를 통해 민감정보 헤더 비활성화가 가능하다.)

 

5. 인터넷 미디어 타입

- Content-Type 헤더는 중요하다. 이는 타입, 서브타입, 옵션인 매개변수로 구성된 인터넷 미디어 타입이다.

- 마임타입(옛날꺼)과는 다르지만, 대개 같은 것을 가리킨다. 

 

6. 요청 바디

- 일반적인 GET요청에는 바디가 없지만, POST요청은 바디가 있다.

- 바디에서 가장 널리 쓰이는 미디어타입은 application/x-www-form-urlencoded 이며, 쿼리스트링과 같이 앰퍼샌드로 구분된 키-밸류의 쌍 형태이다.

- POST 파일 업로드의 경우에는 multipart/form-data 타입을 사용한다.

- AJAX 요청에서는 application/json 을 사용한다.

 

7. 요청 객체

- 요청 객체는 핵심 노드 객체인 http.IncomingMessage의 인스턴스로 시작한다.

- 이 객체는 요청 핸들러의 첫 번째 매개변수로 전달되므로, 이름은 원하는 대로 쓸 수 있지만 보통 req, request 를 가장 많이 사용한다.

- 이제 araboza

 

req.params

- 이름 붙은 라우트 매개변수가 담긴 배열이다. 나중에 자세히 나온다.

 

req.query

- 이름-값 쌍의 형태인 쿼리스트링 매개변수를 담은 객체.

 

req.body

- POST 매개변수를 담은 객체이다. 프론트에서 뭔가를 보내면 요기 담긴다.

- 바디 콘텐츠 타입을 분석할 수 있는 미들웨어가 필요하며, body-parser라이브러리를 주로 사용하였으나, express에 얼마 전에 내장되었다.

 

req.route

- 현재의 라우트에 관한 정보이다. 라우트 디버깅에 가장 많이 사용한다.

 

req.cookies/req.signedCookies

- 클라이언트에서 전송한 쿠키 값을 담은 객체이다. 나중에 더 자세히 나온다.

 

req.headers

- 요청헤더이다. 

 

req.accepts(types)

- 클라이언트가 주어진 타입을 받아들이는지 확인하는 편의 메서드. 공개 API를 제작하려는 사람들이 주로 이용하며, 브라우저가 항상 HTML을 받아들인다고 가정한다.

- 옵션인 types에는 application/json 같은 마임 타입, 콤바로 구분한 리스트, 배열을 쓸 수 있다.

 

req.ip

- 클라이언트의 ip주소이다.

 

req.path

- 요청 경로

 

req.hostname

- 클라이언트에서 전송한 호스트 이름을 반환하는 편의 메서드이다.

- 위조될 수 있으므로, 보안 목적으로 사용해서는 안된다.

 

req.xhr

- 요청이 AJAX에서 비롯되었다면 true를 반환하는 프로퍼티이다.

 

req.protocol

- 요청에 사용된 프로토콜이다.

 

req.secure

- 암호화된 연결인 경우 true를 반환하는 편의 프로퍼티이다. 

- req.protocol === 'https'와 동등하다.

 

req.url/req.originalUrl

- 경로와 쿼리스트링을 반환한다.

- 단, 프로토콜, 호스트, 포트는 포함하지 않는다.

 

다음시간에는 응답 객체~

댓글