노드 학습 9일차
안녕하세요!
오늘은 추가로 미들웨어 몇 가지에 대해 공부했습니다.
morgan
이 미들웨어는 요청과 응답에 대해 로그를 남깁니다.
직전까지 제가 학습할 때에는 모든 라우터에 대해 기록을 남기기 위해 직접 로그를 남겼었는데, 이 작업을 보다 자세하고 편리하게 처리해줍니다.
설치 방법
npm i morgan
사용 방법
1
2
3
4
5
6
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('dev'));
인수의 의미
dev 라는 문자열을 인수로써 전달해주고 있는데요 이는 morgan 미들웨어 에서 정한 몇가지 포맷입니다.
인수 | 의미 |
---|---|
dev | 개발 환경에서 사용할 때 사용합니다 HTTP METHOD, URL, STATUS, 응답 시간의 구조 |
combined | 운영 환경에서 사용합니다. 자세한 정보를 기록에 남깁니다 (ex: IP, 시간, 요청 브라우저 등) |
common | 표준 아파치 로그 형식을 따릅니다 |
short | 기본보다 짧은 로그를 남깁니다 |
tiny | 최소화 한 로그만 남깁니다 |
bodyParser
현재 bodyParser 이라는 미들웨어는 express 내장 기능으로 많이 대체되었습니다. 그러니 굳이 용량 차지하게 설치할 필요는 없으니 express로 대신해서 보겠습니다.
우선 해당 기능은 핵심적으로 클라이언트가 보내는 정보를 request 객체의 body 속성으로 손쉽게 확인할 수 있도록 합니다.
사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express = require('express');
const app = express();
// json 데이터를 파싱할 때 사용
app.use(express.json());
// form 데이터를 파싱할 때 사용
// extended true -> qs 모듈 사용, extended false -> queryString 모듈 사용
app.use(urlencoded({ extended: true }));
app.get('/body',(req,res)=>{
console.log(req.body);
res.send('hello express');
})
기능 설명
request 객체의 body 속성에서 손쉽게 값을 가져올 수 있습니다.
express.json()
은 json 정보를 파싱하며 urlencoded()
는 html의 form 태그로 전달되는 값을 파싱합니다.
cookieParser
request 객체의 cookies 속성에 쿠키 정보를 담아줍니다.
복잡한 쿠키 파싱 처리를 생략할 수 있습니다!
그리고 반대로 쿠키를 전달하는 과정도 response 객체를 통해 손쉽게 할 수 있습니다.
설치 방법
npm i cookie-parser
오타나기 쉬우니까 주의하세요
사용 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
// 서명키를 인수로 전달할 수도 있으며 여기서는 간단한 예시로 넣었습니다
app.use(cookieParser('secret'));
// 쿠키 저장
app.get('/setCookie',(req,res,next)=>{
/*
* 쿠키를 저장합니다.
* 키,값,옵션 순서의 인수를 가집니다
* 이 쿠키에는 서명을 붙이지 않았습니다
*/ res.cookie('name','존!!!시나!!!',{
httpOnly:true,
expires : new Date(Date.now()+10000),
path : '/'
});
res.cookie('age','히미츠',{
httpOnly:true,
expires : new Date(Date.now()+10000),
path:'/',
signed : true
})
res.send('쿠키가 설정되었습니다')
})
// 쿠키 출력
app.get('/getCookie',(req,res,next)=>{
// cookie-parser 모듈에 의해 쿠키 정보가 정리되어 나옵니다
console.log('Cookies : ',req.cookies);
// 서명이 붙은 쿠키 정보를 가져옵니다.
console.log('Signed Cookies :',req.signedCookies);
res.send(`name : ${req.cookies.name}<br> age : ${req.signedCookies.age}`);
})
// 쿠키 삭제
app.get('/clearCookie',(req,res,next)=>{
res.clearCookie();
res.send('쿠키가 삭제되었습니다');
})
기능 설명
쿠키 저장, 확인, 삭제 등의 작업을 손쉽게 할 수 있습니다.
쿠키 저장
response 객체를 통해 쿠키를 저장할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
app.get('/setCookie',(req,res,next)=>{
res.cookie('name','존!!!시나!!!',{
httpOnly:true,
expires : new Date(Date.now()+10000),
path : '/'
});
res.cookie('age','비밀',{
httpOnly:true,
expires : new Date(Date.now()+10000),
path:'/',
signed : true
})
res.send('쿠키가 설정되었습니다')
})
cookoe()
함수를 통해 쿠키를 저장합니다.
인수로는 키,값,옵션
을 인수로 받으며 이미 키가 존재하는 경우 새로운 값으로 덮어쓰게 됩니다.
옵션은 객체 형식으로 제공되어야 합니다.
쿠키 옵션
이름 | 설명 | 기본값 |
---|---|---|
maxAge | 만료 시간(밀리 초 단위) | (없음) 브라우저 종료 시 삭제됨 |
expires | 만료 날짜 (GMT 기준) | (없음) 브라우저 종료 시 삭제됨 |
path | 쿠키 경로 | / |
domain | 쿠키 도메인 | loaded |
secure | https 에서만 사용 가능 여부 | false |
httpOnly | 웹서버를 통해서만 접근 여부 | false |
signed | 쿠키 서명 지정 | false |
쿠키 확인
request 객체에서 확인 할 수 있습니다.
쿠키를 만들 때 signed
옵션의 값에 따라 키가 달라집니다.
signed:false
한 쿠키1 2 3 4
app.get('/getCookie',(req,res,next)=>{ console.log('Cookies : ',req.cookies); })
request객체의 cookies
속성에서 값을 가져옵니다
signed:true
한 쿠키1 2 3
app.get('/getCookie',(req,res,next)=>{ console.log('Signed Cookies :',req.signedCookies); })
request 객체의 signedCookies
속성에서 값을 가져옵니다.
쿠키 삭제
쿠키를 삭제합니다. 특정 쿠키를 삭제할 수도 있습니다.
특정 쿠키를 삭제하고 싶을 때에는 옵션도 동일하게 전달해줘야 쿠키를 삭제할 수 있습니다.
단, maxAge
, expires
옵션은 고려되지 않습니다.
전체 삭제
서명된 특정 쿠키 삭제
서명되지 않은 특정 쿠키 삭제
static
express에서 제공하는 미들웨어 중 하나인 static 입니다.
express의 static 모듈을 사용하면 정적 파일을 제공할 때 실제 경로와 요청 경로를 상이하게 할 수 있습니다.
- 특징
- 보안적 측면의 안전성 (요청 경로와 실제 경로가 다름)
- 정적 파일이 있을 경우 다음 미들웨어로 가지 않고 종료됨
- 파일이 없을 경우 다음 미들웨어로 next 함
사용법
1
2
3
4
5
const express = require('express');
const app = express();
// 예시) app.use({요청경로},express.static({실제경로}));
app.use('/',express.static(__dirname+'/public'));
제가 수강 중인 강의의 내용과는 조금 다릅니다. 버전의 차이인지 까지는 확인을 하지 않았습니다
사용 예시
위와 같이 static 미들웨어를 설정할 경우 /
으로 요청이 오는 경우 static 미들웨어는 제가 설정한 실제 경로에서 요청된 파일을 찾아 제공합니다.
위의 사용 법을 예로 설명하자면
1
app.use('/',express.static(__dirname+'/public'));
이런 경우 모든 요청은 이 미들웨어를 거치게 됩니다. 요청 경로의 값이 /
(root) 이기 때문입니다.
만약 정적 파일을 요청하는 함을 명확히 하기 위해 다음 처럼 사용했다 가정해 보겠습니다.
1
app.use('/static/file',express.static(__dirname+'/public'));
이런 경우 /static/file
로 시작하는 모든 요청에 한해서만 미들웨어를 거치게 됩니다.
참고 사항
static 미들웨어는 제공될 정적 파일이 확인된다면 다음 미들웨어로 넘어가지 않습니다.
이러한 특성 때문에 미들웨어의 사용 순서가 중요합니다.
예를 들어 사용자의 권한이나 역할 등을 확인하지 않고 모든 사용자에게 정적 파일을 제공하는 상황에 대해서는 세션, 쿠키 등을 확인하기 전에 먼저 static 미들웨어를 거쳐서 파일만 제공하고 작업이 종료되는 것이 효율적일 수 있습니다.
반면 권한 체크 등의 작업이 필요한 경우에는 static 미들웨어는 해당 작업의 아래에 위치해야합니다.
express-session
세션의 사용을 돕는 미들웨어 입니다.
설치 방법
내장 미들웨어나 모듈이 아니기 때문에 별도 설치해야합니다.
npm i express-session
세팅 방법
1
2
3
4
5
const express = require('express');
const app = express();
const session = require('express-session');
app.use(session());
기능 설명
사용자에 대한 세션 관리를 돕습니다.
예시로 각각의 사용자를 고유하게 구분하게 위해 순수 노드에서는 복잡한 처리를 필요로 했지만 express-session
모듈은 각각의 사용자에 대한 고유한 세션으로 관리하게 됩니다.
사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 생략
app.use(session({
// name: 'session',
resave: false,
saveUninitialized: false,
secret: 'secret', // 보통은 env 를 통해 관리하지만 임의로 문자열 사용
cookie:{
httpOnly: true,
}
}));
app.get('/setSession',(req,res)=>{
req.session.name = '홍길동';
req.session.gender = 'male';
req.session.age = 'unknown';
req.session.random = Math.random();
})
app.get('/getSession',(req,res)=>{
console.log(req.session);
res.send(req.sessionID);
})
만약 이렇게 설정했다면 /
로 연결 시 각각의 사용자는 세션에 random 이라는 이름으로 무작위 숫자 값을 가지게 됩니다.
모든 사용자는 고유한 구분자를 가지게 되며 이는 req.sessionID
를 통해 알 수 있습니다.
옵션 설명
옵션 | 기능 | 기본값 |
---|---|---|
secret | 세션 ID 서명 문자열 | 없음 |
name | 세션 ID를 저장할 쿠키의 이름 | connect.sid |
cookie | 쿠키의 설정을 정의하는 객체 | |
store | 세션을 저장할 저장소 | 메모리(서버 재시작 하면 사라짐) |
resave | 세션의 수정이 없어도 매 요청마다 저장할지 여부 | true |
saveUninitialized | 새로 만들어진 세션이 초기화 안되어 있어도 저장할지 여부 | true |
rolling | 매 요청마다 쿠키의 만료 시간 연장 여부 | false |
unset | 세션 제거시 쿠키 처리 방법 - keep, destroy 중 사용 가능 | ‘keep’ (쿠키는 유지) |