// server1.js
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8' }); // Header: 응답에 대한 정보 기록
res.write('<h1>Hello Node!</h1>'); // Body: 클라이언트로 보낼 데이터
res.end('<p>Hello Server!</p>'); // (인수 전달 후)응답 종료
})
.listen(8080, () => { // 포트 번호, 연결 완료 후 실행될 콜백 함수
console.log('8080번 포트에서 서버 대기 중입니다!');
});
$ node server1
http://localhost:8080 or http://127.0.0.1:8080
Ctrl
+ C
포트
- 서버 내에서 프로세스를 구분하는 번호
- 일반적인 웹 사이트들은 포트 번호 따로 표시 X (80, 443을 사용하기에 생략)
- 리눅스/맥 환경에서 1024번 이하의 포트에 연결할 때 관리자 권한 필요
- sudo 명령어 추가
- 유명한 포트 번호
- 21(FTP)
- 80(HTTP)
- 443(HTTPS)
- 3306(MYSQL)
HTTP 상태 코드
- 2XX: 성공
- 200(성공), 201(작성됨)- 3XX: 리다이렉션
- 301(영구 이동), 302(임시 이동), 304(수정되지 않음 - 캐시 사용)- 4XX: 요청 오류
- 400(잘못된 요청), 401(권한 없음), 403(금지됨), 404(찾을 수 없음)- 5XX: 서버 오류
- 500(내부 서버 오류), 502(불량 게이트웨이), 503(서비스 사용 불가)
- 발생하는 경우가 거의 없도록 해야함..
- 에러 발생여부에 상관없이 무조건 클라이언트에게 응답을 보내야함
서버와 클라이언트 분리
브라우저의 Network 탭에서 네트워크 요청 내용을 실시간으로 볼 수 있음
- Name, Method, Status, Protocol, Type(요청 종류, xhr: AJAX)
유효 기간 존재
단순한 '키 - 값'의 쌍 (문자열 형식, 세미콜론으로 구분)
요청의 헤더에 담겨 전송 -> 사용자가 누구인지 파악
한글, 줄바꿈 포함 금지
- 한글은 ${endoeURIComponent('한글')} 감싸서 넣기
const http = require('http');
http.createServer((req, res) => {
// req.url: 주소의 path와 search 부분
console.log(req.url, req.headers.cookie);
res.writeHead(200, { 'Set-Cookie': 'mycookie=test' });
res.end('Hello Cookie');
})
.listen(8080, () => { // 포트 번호, 연결 완료 후 실행될 콜백 함수
console.log('8080번 포트에서 서버 대기 중입니다!');
});
// undefined
// favicon.ico {mycookie: 'test'}
// 실제 배포용 서버에는 세션을 변수에 저장 X -> DB에 저장
const session = {}
// 생략
res.writeHead(302, {
Location: '/',
'Set-Cookie': `session=${Date.now()}; Expires=${new Date.toGMTString()}; HttpOnly; Path=/`,
});
const cluster = require('cluster');
if(cluster.isMaster) {
cluster.fork(); // 워커 프로세스 생산
}