0603 http 모듈로 서버 만들기

2021. 6. 3. 11:21Node.js

http 모듈에는 createServer 메서드가 있다.
요청이 들어올 때마다 매번 콜백 함수가 실행된다. 이 콜백 함수에 응답을 정해주면 된다.
req와 res 매개변수가 있다.
request = req (클라이언트가 서버에 요청)
response = res (서버가 클라이언트에 응답)
req는 요청에 관한 정보들, res는 응답에 관한 정보를 담고 있다.

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

//server1.js

const http = require('http');
const port = 3000;
const server = http.createServer((req,res)=>{
    res.write('<h1>Hello World!</h1>'); //응답
    res.end('<p>Hello Server!</p>'); //연결 끊기
});

server.listen(port,()=>{
    console.log(`${port}번 포트에서 서버 대기 중입니다.`); //요청
});

========================================

const http = require('http');

const server = http.createServer((req,res)=>{
    res.write('<h1>Hello World!</h1>');
    res.end('<p>Hello Server!</p>');
});

server.listen(8000);
server.on('listening', ()=>{
    console.log('8000포트에서 서버 대기 중');
});
server.on('error', (error)=>{
    console.log(error);
});

웹 브라우저에서 제대로 요청 완료된 것을 확인할 수 있다.

 

 


//server2.js
//파일을 불러와서 서버에서 읽기

const http = require('http');
const fs = require('fs');
const port = 3001;

const server=http.createServer((req,res)=>{
    fs.readFile('./server.html',(err,data)=>{
        if(err) throw err;
        res.end(data);
    })
});

server.listen(port,()=>{
    console.log(`${port}포트에서 서버 대기 중입니다.`);
});
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>테스트 서버</title>
</head>
<body>
    <h1>Node.js 웹 서버</h1>
    <p>만들 준비 됐다 집에 가고 싶다</p>
</body>
</html>


쿠키와 세션

클라이언트에서 보내는 요청은 누가 보내는지 모른다. 그래서 로그인을 구현하려면 내부적으로 쿠키와 세션을 사용한다.
로그인을 하면 로그인 정보를 쿠키에 저장하고, 다시 서버에 요청을 하면 응답할 때 쿠키를 같이 보내준다. (서버가 쿠키를 만듦.)
서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 요청할 때마다 쿠키를 동봉해서 보내준다.
쿠키는 키-값 한 쌍으로 구성되며, 서버는 요청에 들어 있는 쿠키를 읽어서 사용자가 누구인지 파악한다. 쿠키가 내가 누구인지 지속적으로 추척하는 역할.
쿠키는 요청과 응답의 헤더에 저장되고, 요청과 응답은 헤더와 본문에 저장된다.
웹 브라우저는 자동으로 동봉해서 보내주므로 따로 처리할 필요가 없지만 서버에서 브라우저로 쿠키를 보낼 땐 코드로 작성한다.

const http = require('http');

let server = http.createServer((req,res)=>{
    //console.log('cookie:'+req.headers.cookie);
    //console.log('url:'+req.url);
    //const cookie = parseCookies(req.headers.cookie); //쿠키는 헤더에 저장된다. 
    res.writeHead(200,{'Set-Cookie':'mycookie=test'});
    res.end('Hello Cookie');
})

server.listen(3002,()=>{
    console.log('3002포트에서 서버 대기 중');
})

F12의 콘솔 모드에서 확인할 수 있다.

 

하지만 위의 코드는 쿠키는 생성했지만 내가 누구인지 분간하지 못 한다.

const http=require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

//서버 생성
let server = http.createServer((req,res)=>{
    if(req.url.startsWith('/login')){
        console.log('로그인');
    }
    res.end('200');
});
//서버 시작
server.listen(3004,()=>{
    console.log("서버가 시작되었습니다.");
});

const http=require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

//서버 생성
let server = http.createServer((req,res)=>{
    let message = ''
    
    console.log("/ :"+req.url.startsWith('/'));
    console.log("/login :"+req.url.startsWith('/login'));

    if(req.url.includes('/')){
        message = 'home';
        if(req.url.includes('/login')){
            message= 'login';
        }
    }
    
    res.end(message);
});
//서버 시작
server.listen(3004,()=>{
    console.log("서버가 시작되었습니다.");
});

둘은 다른 경로다. 주소별로 분기 처리

 

const http=require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

//서버 생성
let server = http.createServer((req,res)=>{
    let message = ''

    if(req.url.includes('/')){
        message = 'home';
        if(req.url.includes('/login')){
            message= 'login';

            console.log("url: "+url);
            const {query}= url.parse(req.url);
            console.log("query"+query);
            const{name, age}=qs.parse(query);
            console.log("name:"+name,", age:"+age);
        }
    }
    
    res.end(message);
});
//서버 시작
server.listen(3004,()=>{
    console.log("서버가 시작되었습니다.");
});

querystring을 파싱해서 주소에 딸려오는 퀴리를 분석한다.

 

const http=require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');

/*const parseCookies = (cookie='')=>
    cookie.split(';')
    .map(v=>v.split('='))
    .map(([k,...vs])=>[k,vs.join('=')])
    .reduce((acc,[k,v])=>{
        acc[k.trim()] = decodeURIComponent(v);
        return acc;
},{});*/이건 별로 중요한 것이 아님 쿠키를 만드는 코드이다.

//서버 생성
let server = http.createServer((req,res)=>{
    let cookie = {};
    if(req.headers.cookie==undefined){
        res.writeHead(200,{'Set-Cookie':'mycookie=test'});
        console.log('created cookie');
    }
    else{
        const cookie = parseCookies(req.headers.cookie);
        console.log(cookie);
    }

    res.end();
});

//서버 시작
server.listen(3004,()=>{
    console.log("서버가 시작되었습니다.");
});

쿠키가 undefined인 경우엔 새로운 쿠키를 생성하고, 쿠키가 있다면 쿠키의 value를 출력하도록 했다.

 


 

const http=require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');
const port = 3004;

//서버 생성
let server = http.createServer((req,res)=>{
    fs.readFile('./server4.html',(err,data)=>{
        if(err) throw err;
        res.writeHead(200, {'Set-Cookie':'mycookie=test'})
        res.end(data);

        let message = '';
        if(req.url.includes('/')){
            message = data;
            if(req.url.includes('/login')){
                const {query} = url.parse(req.url);
                const {name}=qs.parse(query);
                console.log("name: "+name);
            }
        }
    })
});
//서버 시작
server.listen(port,()=>{
    console.log("서버가 시작되었습니다.");
});
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>쿠키&세션 이해하기</title>
</head>
<body>
    <form action="/login"> 
        <input id="name" name="name" placeholder="이름을 입력하세요."/>
        <button id="login">로그인</button>
    </form>
</body>
</html>

html 페이지를 불러와 input필드로 로그인을 하면,
로그인 아이디로 넣은 것이 출력 되도록 했다.
동시에 쿠키도 생성되도록 수정

 

'Node.js' 카테고리의 다른 글

0609 express 서버 열기  (0) 2021.06.09
0608 npm express 웹 서버 만들기  (0) 2021.06.08
0608 REST API와 라우팅  (0) 2021.06.04
0602 js2(array, promise,module,timeout/interval,예외처리)  (0) 2021.06.02
0601 Node.js  (0) 2021.06.01