본문 바로가기

Node.js

[Node.js] http 모듈로 웹서버 만들기

1. 요청과 응답 이해하기

- 클라이언트에서 서버로 요청(request)을 보내고, 서버에서는 요청의 내용을 읽고 처리한 뒤 클라이언트에게 응답(response)를 보냄

- 클라이언트로부터 요청이 왔을때 어떤 작업을 수행할지 이벤트 리스너를 만들어 놓아야 함

 

 

① http 서버가 있어야 웹브라우저 요청을 처리하므로 http 모듈 사용

② createServer메서드 

- 인자로 요청에 대한 콜백 함수를 넣을 수 있음

- 요청이 들어올 때마다 콜백 함수 실행,  따라서 이 콜백 함수에 응답을 적어주면됨

- 콜백함수의 인자로 요청에 관한 정보를 담는 req, 응답에 관한 정보를 담는 res 가 들어감

- res.write의 첫 번째 인자는 클라이언트로 보낼 데이터

- res.end는 응답을 종료하는 메서드로 인자가 있다면 그 데이터를 클라이언트로 보내고 응답을 종료함

 

③ listen 메서드

- createServer메서드 뒤에 listen 메서드를 붙이고 클라이언트에게 공개할 포트 번호와 포트 연결 완료 후 실행될 콜백 함수를 넣음

- 이제 이 파일을 실행하면 서버는 8080포트에서 요청이 오길 대기함

- listen메서드에 콜백 함수 대신 이벤트 리스너를 붙여도 됨

 

 

 

클라이언트와 서버 간의 HTTP 요청에서는 사용자에 대한 정보를 저장하지 않기 때문에(Stateless) 쿠키와 세션으로 HTTP에 상태 정보를 유지함

쿠키

  • 클라이언트에 저장
  • 쿠키 저장 시 만료일시 설정 가능
  • 클라이언트에서 쿠키 정보를 쉽게 변경, 삭제 가능하여 보안에 취약한 편

 

요청/응답 헤더에 저장됨

서버에서 직접 쿠키를 만들어 클라이언트(브라우저)에 보내기

 

res.writeHead메서드: 헤더에 쿠키를 기록하기 위해 사용, 첫 번째 인자로 상태코드를 두 번째 인자로는 헤더의 내용을 입력함

Set-Cookie: 브라우저한테 다음과 같은 값의 쿠키를 저장하라는 의미, 실제로 응답을 받은 브라우저는 mycookie=test라는 쿠키를 저장함

 

쿠키로 식별하기

- 주소가 '/login'으로 시작할 경우 url과 querystsring 모듈로 각각 주소와 주소에 딸려오는 query를 분석

- 그 외의 경우 먼저 쿠키가 있는지 없는지 확인하여 쿠키가 없다면 로그인할 수 있는 페이지를 보냄

 

 

 

세션

  • 웹 서버에 저장
  • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
  • 클라이언트가 요청시 서버는 세션 ID를 생성하여 전달하고 클라이언트는 이를 받아 세션쿠키로 저장

 

서버가 사용자 정보를 관리하기 위해 세션 사용을 사용하는 예제

- 쿠키에 이름을 담아서 보내지 않고 randomInt라는 임의의 숫자를 보냄

- 사용자의 이름과 만료 시간은 session이라는 객체에 저장함

- cookie.session이 존재하고 만료기한을 넘기지 않았다면 session 변수에서 사용자 정보를 가져와서 사용

- 서버에 사용자 아이디를 저장하고 클라이언트와는 세션 아이디로 주고 받음

 

 

1. HTTP 헤더의 용도

HTTP 전송에 필요한 모든 부가 정보를 담기위해 사용

- 메시지 바디 내용, 메시지 바디 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등 전송에 필요한 모든 부가 정보

 

request/response 구조

1) Request

구조 내용 설명
시작줄(start line) GET naver.com HTTP/1.1 API 호출, URL주소, HTTP/버전
헤더(headers) Content-Type 없음 -
application/x-www-form-urlencoded HTML
application/json AJAX
본문(body) (보통) 내용 없음 GET요청 시
(보통) 사용자가 입력한 폼 데이터 또는 json데이터 POST요청 시

 

2) Response

구조 내용 설명
상태줄( status line) HTTP/1.1 404 Not Found API 요청 결과(HTTP/버전, 상태 코드, 상태 텍스트)
헤더(headers) Content-Type 없음 -
text/html HTML
application/json AJAX
Location http://localhost:8080/hello.html Redirect할 페이지 URL
본문(body) <!DOCTYPE html>
<html>
  <head><title>By @ResponseBody</title></head>
   <body>Hello, Spring 정적 웹 페이지!!</body>
</html>
컨텐츠 타입이 HTML일 경우

  "name":"홍길동",
  "age": 20
}
컨텐츠 타입이 JSON일 경우