유용한 패키지들¶
morgan [1]¶
모르간은 HTTP 요청 로그 미들웨어입니다.
설치는:
npm install --save morgan
사용법은:
const morgan = require('morgan')
app.use(morgan('dev'));
로그 파일로 저장¶
morgan이 지원하는 로그 포맷에는 ‘default’, ‘short’, ‘tiny’, ‘dev’가 있으며, 파일로 로그를 저장하려면 다음과 같이 입력합니다:
const fs = require('fs');
app.use(morgan({
format: 'dev',
stream: fs.createWriteStream('app.log', {'flags': 'w'})
}));
dotenv [2]¶
.env
파일의 키=값
형태의 문자열을 읽어서 process.env.키
형태로 앱에서 사용할 수 있게 합니다.
설치¶
다음과 같이 설치를 합니다.
npm install dotenv --save
현재 파일 디렉토리에 있는 .env
파일을 읽어 들입니다.
require('dotenv').config()
옵션¶
config
인자의 path
옵션을 이용하여 .env
파일의 위치를 지정할 수 있습니다.
require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })
.env
파일 안에 앱에서 사용될 키=값
형식으로 저장합니다.
//contents of .env
SECRET_KEY=abcd1234
앱에서 process.env.키
형식으로 값을 접근할 수 있습니다.
예를 들면:
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
require('dotenv').config();
app.get('/', (req, res) => {
res.send(process.env.SECRET_KEY);
})
app.listen(port, () => {
console.log(`Server is running on port ${port}.`)
})
물론 비밀키는 공적으로 보여지면 안됩니다.
파싱¶
parse()
함수를 이용해서 키=값
형식의 환경 변수를 포함한 파일을 파싱할 수 있습니다. parse
함수는 String
또는 Buffer
를 인자로 받아 {키: 값}
형식의 Object
를 반환합니다.
const dotenv = require('dotenv')
const buf = Buffer.from('BASIC=basic')
const config = dotenv.parse(buf) // will return an object
console.log(typeof config, config) // object { BASIC : 'basic' }
규칙¶
파싱은 다음과 같은 규칙을 따릅니다.
BASIC=basic
becomes{BASIC: 'basic'}
empty lines are skipped
lines beginning with
#
are treated as commentsempty values become empty strings (
EMPTY=
becomes{EMPTY: ''}
)single and double quoted values are escaped (
SINGLE_QUOTE='quoted'
becomes{SINGLE_QUOTE: "quoted"}
)new lines are expanded if in double quotes (
MULTILINE="new\nline"
becomes{MULTILINE: 'new line'}
inner quotes are maintained (think JSON) (
JSON={"foo": "bar"}
becomes{JSON:"{\"foo\": \"bar\"}"
)whitespace is removed from both ends of the value (see more on trim) (
FOO=" some value "
becomes{FOO: 'some value'}
)
jsonwebtoken¶
Json Web Token(jwt)을 생성 및 해독할 수 있는 모듈입니다.
사용법¶
토큰 생성¶
jwt.sign(payload, secret, options, [callback])
만약에 callback 이 전달되면 비동기적으로 작동하며, 콜백함수의 파라미터는 (err, token) 입니다. 전달되지 않을시엔 동기적으로 작동하며, JWT를 문자열 형태로 리턴합니다.
payload
는 객체, buffer, 혹은 문자열 형태로 전달 될 수 있습니다.
secret
은 서명을 만들 때 사용되는 알고리즘에서 사용되는 문자열 혹은 buffer
형태의 값 입니다.
sign 옵션
- algorithm: 기본값은 HS256 으로 지정됩니다.
- expiresIn: JWT 의 등록된 클레임중
exp
값을x
초후 혹은 zeit/ms 형태의 기간 후로 설정합니다. (예제: (60, “2 days”, “10h”, “7d”) - notbefore: JWT 의 등록된 클레임중 nbf 값을 x 초후 혹은 zeit/ms 형태의 기간 후로 설정합니다.(예제: (60, “2 days”, “10h”, “7d”)
- audience
- issuer
- jwtid
- subject
- noTimestamp
- header
- keyid
- mutatePayload: if true, the sign function will modify the payload object directly. This is useful if you need a raw reference to the payload after claims have been applied to it but before it has been encoded into a token.
verify¶
verify
는 토큰이 유효한지를 입증하는 메소드입니다. 유효한 토큰이 확인되면 해독한 토큰 객체를 반환합니다. 유효하지 않은 토큰이면 에러를 발생합니다.
매개변수는 토큰, 시크릿, 콜백함수로 구성됩니다. 에러 유형별로 대응을 할 수 있습니다. 사용법은 다음과 같습니다.
jwt.verify(token, secretOrPublicKey, [options, callback])
콜백(callback
)이 있으면 동기적으로 없으면 비동기적으로 처리됩니다. options
는 깃헙 페이지를 확인하세요.
다음은 간단한 예입니다. 콜백 함수의 매개변수 decoded
는 토큰을 해독한 객체입니다.
jwt.verify(token, process.env.JWT_SECRET, function(err, decoded) {
// 에러 처리
if (err) {
if (err.name === 'TokenExpiredError') {
res.status(401).json({
fail: 'token expired',
})
} else {
res.status(401).json({
fail: err,
})
}
}
// 해독된 토큰 처리
req.auth = {
id: decoded.id,
group: decoded.group
}
})
express-jwt¶
jwt를 검증하고 req.user를 설정하는 미들웨어입니다. jsonwebtoken을 사용하는 것이 더 나을 수 있을 것 같습니다.
설치¶
$ npm install --save express-jwt
사용법¶
var jwt = require('express-jwt');
app.get('/protected',
jwt({secret: 'shhhhhhared-secret'}),
function(req, res) {
if (!req.user.admin) return res.sendStatus(401);
res.sendStatus(200);
});
audience
와 issuer
등을 지정할 수 있습니다.
jwt({ secret: 'shhhhhhared-secret',
audience: 'http://myapi/protected',
issuer: 'http://issuer' })
Note
JWT가 expiration (exp)
를 가지고 있으면 확인을 합니다.
기본적으로 복호화된 토큰은 req.user
에 추가를 하지만 requestProperty
옵션을 사용해서 바꿀 수 있습니다.
jwt({ secret: publicKey, requestProperty: 'auth' });
crypto¶
내장 모듈입니다.
crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)¶
동기적으로 패스워드를 생성하는 함수입니다.
function setPassword(password) {
salt = crypto.randomBytes(16).toString('hex');
hash = crypto.pbkdf2Sync(password, salt, 10000, 512, 'sha512').toString('hex');
return hash;
};
pbkdf2
는 인자로 비밀번호, salt, 반복 횟수, 비밀번호 길이(바이트), 해시 알고리즘 순입니다. 역시 key가 버퍼 형태로 리턴해주기 때문에 toString(‘hex’)를 이용해서 hex 문자열로 만들어서 반환해야 합니다. ‘base64’ 형식으로 반환해도 됩니다. 반복 횟수는 해시 함수를 몇 번 반복하느냐를 나타냅니다. 1만번으로 정해주었는데 이 숫자가 높을 수록 더 안전합니다. 비밀번호 길이는 적당한 길이로 정해주면 됩니다.
salt
를 key와 같이 저장해야 한다는 것을 꼭 기억하세요. randomBytes
메소드는 매번 다른 salt값을 반환하기 때문에 암호화 결과가 매번 달라집니다. 같은 salt값으로 비밀번호를 찾아야 비교가 가능합니다. 또한 반복 횟수, 비밀번호 길이, 해시 알고리즘, 인코딩 방식까지 다 같아야 같은 결과가 나옵니다.
nodemailer¶
nodemailer 를 이용하면 이메일을 보내는 작업을 할 수 있습니다.
transporter를 nodemailer.createTransport()
를 이용해서 만들면 이것이 메일 보내는 역할을 합니다.
transporter.sendMail()
메소드를 이용해서 이메일을 보냅니다.
참조 사이트
[1] | morgan 사이트 https://github.com/expressjs/morgan |
[2] | dotenv 사이트 https://www.npmjs.com/package/dotenv |
[3] | nodemon 사이트 https://www.npmjs.com/package/nodemon |
- nodemailer 자세하게: https://www.diycode.cc/projects/andris9/Nodemailer
- nodemailer 블로그 사이트: https://victorydntmd.tistory.com/113