1. 라우팅 테스트
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.get('/api', (req, res) => {
res.json({
message: 'Welcome to the API'
});
});
app.listen(5000, () => console.log('Server started on port 5000'));
- express: 프로젝트에서 사용할 웹서버 프레임워크
- jsonwebtoken: 이 예제프로젝트에서 사용되는 핵심 모듈이다. JSON Web Token을 손쉽게 생성하고, 또 검증도 해준다.
'/api' URL로 get 요청을 하면 성공적으로 메시지가 나오게 된다.
2. 사용자 정보 암호화 토큰 생성
app.post('/api/login', (req, res) => {
// Mock user
const user = {
id: 1,
username: 'brad',
email: 'bread@gmail.com'
}
# 사용자 정보 암호화 - sign(전달할 내용, 비밀 키, 유효시간, 콜백)
jwt.sign({ user }, 'secretkey', { expiresIn: '30s' }, (err, token) => {
res.json({
token
});
});
});
jwt.sign(payload, secretOrPrivateKey, [options, callback])
- payload : 객체 리터럴, 버퍼 또는 유효한 JSON을 나타내는 문자열. 여기선 임시 유저 정보를 넣어줬다.
- 두 번째 인자 : 비밀 키 전달
- 세 번째 인자 : 토큰에 대한 정보를 객체로 전달
- 네 번째 인자 : 콜백함수 작성. 만약 콜백 함수를 작성하지 않으면 동기 처리가 된다.
3. 토큰 해싱 작업
app.post('/api/posts', verifyToken, (req, res) => {
# 암호 토큰 해싱작업
jwt.verify(req.token, 'secretkey', (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
res.json({
message: 'Post created...',
authData
});
}
});
});
function verifyToken(req, res, next) {
// Get auth header value
const bearerHeader = req.headers['authorization'];
// Check if bearer is undefined
if (typeof bearerHeader !== 'undefined') {
// Split at the space
const bearer = bearerHeader.split(' ');
// Get token from array
const bearerToken = bearer[1]; // 토큰 값
// Set the token
req.token = bearerToken;
// Next middleware
next();
} else {
// Forbidden
res.sendStatus(403);
}
}
jwt.verify(token, secretOrPublicKey, [options, callback])
: jsonwebtoken 모듈에서 권한을 확인하는 메서드
- 첫 번째 인자 : 토큰 값을 전달
-
인증이 된 유효한 토큰인지 확인하기 위한 것
-
토큰은 쿠키에 저장되어 있으므로 요청 객체에서 cookies 속성을 확인하면 된다. ( express에서는 자동으로 cookieparser 미들웨어가 등록되어 있다. )
- 두 번째 인자 : 토큰 생성 시에 사용한 비밀 키를 디코딩하기 위해 똑같이 사용한다.
- 네 번째 인자 : 콜백함수 유무에 따라 비동기, 동기로 동작한다.
위의 코드에서 로그인한 사용자는 JWT토큰을 생성받았기에 어떤 API를 사용할 권리가 있게 된다.
/api/posts URL로 요청하면, 쿠키에서 토큰 값을 읽고 verify() 함수를 호출해 json객체를 반환한다.
<전체 코드>
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.get('/api', (req, res) => {
res.json({
mesaage: 'Welcom to the API'
});
});
app.post('/api/posts', verifyToken, (req, res) => {
jwt.verify(req.token, 'secretkey', (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
res.json({
mesaage: 'Post Created..',
authData
});
}
});
});
app.post('/api/login', (req, res) => {
// Mock user
const user = {
id: 1,
username: 'brad',
email: 'brad@gmail.com'
}
jwt.sign({ user: user }, 'secretkey', { expiresIn: '30s' }, (err, token) => {
res.json({
token // token: token
});
});
});
// FORMAT OF TOKEN
// Authorization: Bearer <access_token>
// Verify Token
function verifyToken(req, res, next) {
// Get auth header value
const bearerHeader = req.headers['authorization'];
// Check if bearer is undefined
if (typeof bearerHeader !== 'undefined') {
// Split at the space
const bearer = bearerHeader.split(' ');
// Get token from array
const bearerToken = bearer[1];
// Set the token
req.token = bearerToken;
// Next middlewear
next();
} else {
// Forbidden
res.sendStatus(403);
}
}
app.listen(5001, () => console.log('Server started on port 5001'));
'Node.js' 카테고리의 다른 글
[Node.js] http-proxy-middleware 모듈 (0) | 2020.11.10 |
---|---|
[Node.js] Mongoose 모듈 사용하기 (0) | 2020.11.03 |
[Node.js] Express.js 란 무엇인가? (0) | 2020.11.02 |
[Node.js] package.json 파일은 무엇인가? (0) | 2020.08.02 |