무작정 개발.Vlog

[node.js] 웹 서버 구축, express 미들웨어

by 무작정 개발
반응형
2022.04.04(70일 차)

 

이번에는 express의 미들웨어에 대해 정리할 것이다.

 

node.js
node.js

 

 

오늘의 수업 내용

 

 

node.js로 웹 서버 구축

ExpressExe 프로젝트 폴더 구성
ExpressExe 프로젝트 폴더 구성

node.js는 메모리 상에서 실행되기에 속도가 빠르다.

기존까지 하던 톰켓(TomCat)을 사용하는 것이 아닌 node.js를 이용하여 웹 서버를 만들 것이다.

 

 

Middleware(미들웨어)

 

미들웨어(Middleware) 란?

  • 하나의 독립된 함수(use 메서드로 설정)
  • 클라이언트에게 요청이 오고 그 요청을 보내기 위해 응답하려는 거쳐가는 중간 다리 함수
  • 미들웨어 함수req 객체, res 객체, 애플리케이션 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수
  • next 함수를 이용해서 다음 미들웨어로 현재 요청을 넘길 수 있음

app1.js

/*
http://localhost:3000
미들웨어 : 하나의 독립된 함수(use 메서드로 설정)
라우터 : (요청 패턴 /,/users,/sales,/bbs)

클라이언트 요청 -> 미들웨어#0 -> 라우터(/) -> 클라이언트 응답
클라이언트 요청 -> 미들웨어#0 -> 라우터(/users) -> 클라이언트 응답
클라이언트 요청 -> 미들웨어#0 -> 라우터(/sales) -> 클라이언트 응답
*/

// Express 기본 모듈
var express = require("express");
var http = require("http");

//익스프레스 객체 생성
var app = express();

//기본 포트를 app객체의 속성으로 설정
//express 서버 객체의 메서드(set,get,use)
app.set("port",process.env.PORT||3000);


//미들웨어 객체(use) 생성
// - 미들웨어는 따로 호출안해도 자동으로 실행된다. / 여러 개 있으면 미들웨어1이 끝나면 미들웨어2가 자동으로 실행
// - 브라우저에서 request가 왔을 때 서버에서 어떤 작업을 할 지 router를 통해 설정
app.use(function(req,res,next) { //사용자의 요구가 이상없이 들어오면 next가 실행
	
	console.log("첫번째 미들웨어 실행..");
	
	//res.writeHead("200", {"Content-type":"text/html;charset=utf-8"});
	//res.end("<h1>Express 서버에서 응답한 결과입니다.</h1>")
	
	req.user ="suzi";
	
	next(); //두번 째 미들웨어로 처리를 넘긴다.
	
});

//미들웨어 객체 생성
// - 이 코드가 없으면 웹 접속 시 Cannot Get / 이 뜬다.
app.use("/",function(req,res,next) {
	
	console.log("두번째 미들웨어 실행..");
	
	res.writeHead("200", {"Content-type":"text/html;charset=utf-8"});
	res.end("<h1>Express 서버에서" + req.user + "응답한 결과입니다.</h1>")
	
});


//Express 서버 시작
http.createServer(app).listen(app.get("port"),function() {
	
	console.log("익스프레스 서버를 시작했습니다: " + app.get("port"));
	
});

app.use 안에 있는 모든 함수들은 모두 미들웨어이며, 요청이 올때마다 이 미들웨어를 거치며 

클라이언트에게 응답하게 된다.

Router를 정의하지 않았어도 서버는 시작된 상태가 될 수 있다.

웹 페이지를 들어갔을 때 Cannot GET/ 이 뜨는 이유는 Router(라우터)가 정의하지 않았기 때문이다.

 

app1.js 결과
app1.js 결과
콘솔 결과
콘솔 결과

 


Express 미들웨어 - static, body-parser

 

ExpressExe> npm install serve-static --save  가상url로 접근을 가능하게 해주는 모듈
ExpressExe> npm install body-parser --save    post방식을 지원하는 모듈

 

 

 

cookie-parser 모듈

  • 요청된 쿠키를 쉽게 추출할 수 있도록 해주는 미들웨어
  • request 객체에 cookies 속성이 부여된다.

 

cmd에서 모듈 설치하기

npm install cookie-parser --save
// cookie-parser

//Express 기본 모듈
require("dotenv").config();
var express = require("express");
var http = require("http");
var path = require("path");
var serveStatic = require("serve-static"); //특정 폴더를 패스로 접근 가능하게 하는것.
var expressErrorHandler = require("express-error-handler");

//쿠키 모듈
var cookieParser = require("cookie-parser");

//익스프레스 객체 생성
var app = express();

//기본 포트를 app 객체의 속성으로 설정
//express 서버 객체의 메소드(set.get.use)
app.set("port",process.env.PORT)

app.use(express.urlencoded({extended:false}));

app.use("/public",serveStatic(path.join(__dirname,"public"))); //public (실제)폴더의 이름을 써준것

app.use(cookieParser());

//라우터 객체 추가 
var router = express.Router();


// 라우팅 함수 등록
router.route("/process/showCookie").get(function(req,res){ //"/process/login"라는 경로로 .post 방식으로 왔을때 함수 실행ㅇ
	
	console.log("/process/showCookie 호출.."); 
	
	res.send(req.cookies);
	
});

router.route("/process/setUserCookie").get(function(req,res) { 
	
	console.log("/process/setUserCookie 호출..");
	
	//쿠키 만들기
	res.cookie("user", {
		id: "suzi",
		name: "배수지",
		authorize: true // 인증에 관련된 것
	});
	
	//redirect 응답
	res.redirect("/process/showCookie");
	
});


//라우터 객체를 app에 등록
app.use("/", router);

//404 dpfj cjfl
var errorHandler = expressErrorHandler({
	
	static : {
		"404":"./public/404.html"
	}
	
});

//미들 웨어 등록
app.use(expressErrorHandler.httpError(404)); //404에러가 났을 때 실행
app.use(errorHandler);


//Express 서버 시작
//var server = http.createServer();

http.createServer(app).listen(app.get("port"),function(){ //위에 set으로 넣어둔 port를 get으로 가져온거

	console.log("익스프레스 서버 on~~ 포트번호는:" + app.get("port"));
	
});

콘솔 결과
콘솔 결과
web 결과
web 결과

 

 

express-session 모듈

 

세션 사용, 대표적으로 login 작업에서 사용한다.

npm install express-session --save

가상 주소 : /pub/product

실제 주소 :./public/404.thml

  • 가상 주소 앞에./ 경로를 넣어줄 필요가 없다.

 

[express-session]

 resave 요청이 왔을 때 세션에 수정사항이 생기지 않더라도 세션을 다시 저장할지에 대한 설정 (true-secret 키값 그대로 유지)
 saveuninitialized 세션에 저장할 내역이 없더라도 세션을 저장할지 대한 설정 (보통 방문자를 추적할 때 사용된다.)
secret  필수항목으로 cookie-parser의 비밀 키와 같은 역할을 한다 (세션을 임의로 변조하는 것을 방지)
cookie 세션 쿠키에 대한 설정
secret
쿠키를 임의로 변조하는것을 방지하기 위한 sign 값 입니다. 원하는 값을 넣으면 됩니다.

안전하게 쿠키를 전송하려면 쿠기에 서명을 추가해야 하고, 쿠키를 서명하는데 secret의 값이 필요하다.

이때 cookie-parser의 secret와 같게 설정해야 한다.

 

 

app6.js

//session 사용
// npm install express-session --save



//Express 기본 모듈
require("dotenv").config();
var express = require("express");
var http = require("http");
var path = require("path");
var serveStatic = require("serve-static"); //특정 폴더를 패스로 접근 가능하게 하는것.
var expressErrorHandler = require("express-error-handler");
var cookieParser = require("cookie-parser");

//Session 추가
var expressSession = require("express-session");

//익스프레스 객체 생성
var app = express();

//기본 포트를 app 객체의 속성으로 설정
//express 서버 객체의 메소드(set.get.use)
app.set("port",process.env.PORT)

//미들웨어 등록
app.use(express.urlencoded({extended:false}));
app.use("/public",serveStatic(path.join(__dirname,"public"))); //public (실제)폴더의 이름을 써준것
app.use(cookieParser());
app.use(expressSession({
	
	secret:"my key", //사용자 정의 세션 이름
	resave:true,
	saveUninitialized:true
	
}));


//라우터 객체 추가 
var router = express.Router();


// 라우팅 함수 등록
router.route("/process/login").post(function(req,res){ 
	
	console.log("/process/login 호출.."); 
	
	var id = req.body.id;
	var pwd = req.body.pwd;
	
	//로그인 된 상태
	if(req.session.user) {
		
		console.log("이미 로그인 되어서 상품 페이지로 이동..");
		
		res.redirect("/public/product.html");
		
	} else {
		
		if(id=="suzi" && pwd=="a123") {
			
			//세션 저장
			req.session.user={
					
				id:id,
				name:"배수지",
				authorize:true
			};
			
			res.writeHead("200",{"Content-type":"text/html;charset=utf-8"});
			res.write("<h1>로그인 성공</h1>")
			res.write("<div><p>ID: " + id + "</p></div>");
			res.write("<div><p>Pwd: " + pwd + "</p></div>");
			res.write("<div><p>Name: " + req.session.user.name + "</p></div>");
			res.write("<br><br><a href='/process/product'>상품페이지</a>");
			res.end();
			
			
		}
		
	}
	
});

router.route("/process/product").get(function(req,res) { 
	
	console.log("/process/product 호출..");
	
	if(req.session.user) {
		
		console.log("로그인 되어있음.");
		res.redirect("/public/product.html");
		
	} else {
		
		console.log("로그인 먼저하세요.");
		res.redirect("/public/login3.html");
	}
	
});

router.route("/process/logout").get(function(req,res) { 
	
	console.log("/process/logout 호출...");
	
	if(req.session.user) {
		
		console.log("로그아웃 합니다");
		
		//세션 삭제
		//req.session.destroy(); // 단순 삭제
		
		req.session.destroy(function(err) {
			
			if(err) throw err;
			
			console.log("세션을 삭제하고 로그 아웃 되었습니다.");
			
			res.redirect("/public/login3.html");
			
		});
		
	}else {
		
		console.log("로그인 되어있지 않습니다.");
		
		res.redirect("/public/login3.html");
		
	}
	
});


//라우터 객체를 app객체에 추가
app.use("/", router);

var errorHandler = expressErrorHandler({
	
	static : {
		"404":"./public/404.html"
	}
	
});

app.use(expressErrorHandler.httpError(404));
app.use(errorHandler);


//Express 서버 시작
//var server = http.createServer();

http.createServer(app).listen(app.get("port"),function(){ //위에 set으로 넣어둔 port를 get으로 가져온거

	console.log("익스프레스 서버 on~~ 포트번호는:" + app.get("port"));
	
});

 

login3.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>로그인</h1>
<br>
<form action="/process/login" method="post">
	<table>
		<tr>
			<td>아이디</td>
			<td><input type="text" name="id"/></td>
		</tr>
		<tr>
			<td>비밀번호</td>
			<td><input type="password" name="pwd"/></td>
		</tr>
	</table>
	<input type="submit" value="전송"/>
<!-- 아이디 비밀번호를 입력하고 submit에 의해 전송됌 -->
</form>

<a href="/process/product">상품정보</a>
<a href="/process/logout">로그아웃</a>

</body>
</html>

login3.html
login3.html

 

반응형

'Back-End > node.js' 카테고리의 다른 글

[node.js] MongoDB 연결  (0) 2022.04.04
[node.js] 파일 업로드  (0) 2022.04.04
[node.js] winston 모듈  (0) 2022.04.03
[node.js] 이벤트, 파일 생성 및 삭제  (0) 2022.04.03
[node.js] 배열, 콜백 함수, prototype 객체 생성  (0) 2022.04.03

블로그의 정보

무작정 개발

무작정 개발

활동하기