본문 바로가기
Web - 백엔드/Node.js

[Node.js] Passport 모듈을 이용한 로그인 구현 1 - 모듈 설치 / 준비

by 미래문 2019. 1. 29.
반응형

 


 

 

Node.js 모듈 중에는 Passport라는 모듈이 있습니다.
이 모듈을 사용하면 로그인 시에 인증을 보다 쉽게 구현할 수 있습니다.

프로젝트를 다음과 같이 구성합니다.

코드를 다음과 같이 입력합니다.

/models/User.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// create schema 
const UserSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    name: {
        type: String,
        required: true
    }
});

module.exports = User = mongoose.model('users', UserSchema);

회원 모델에 관한 코드입니다. 로그인에서는 간단히 이메일과 패스워드만 있으면 되지만 약간의 간(?)을 더해줄 이름까지 추가로 작성해줍니다.

/routes/api/users.js

var express = require('express');
var router = express.Router();

router.get('/', (req, res) => {
    res.send("패스포트 모듈 테스트");
});

module.exports = router;

라우팅을 구현해줄 라우터 파일입니다. 아직은 get메서드로 접근시 "패스포트 모듈 테스트"를 출력하는 기본 틀만 존재합니다.

server.js

// 모듈 로드
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

// 초기화 파트
const app = express();
const users = require(
    './routes/api/users');

// 미들웨어 설정 파트
app.use(bodyParser.urlencoded(
{
    extended: false
}));

app.use(bodyParser.json());

// 몽고DB 설정 파트
const db = require('./config/keys')
    .mongoURI;
mongoose.connect(db,
    {
        useNewUrlParser: true
    }).then(() => console.log(
        "몽고 DB가 연결되었습니다."))
    .catch(err =>
        console
        .log(err)
    );

// 라우팅 파트
app.use('/api/users', users);

// 서버 실행
app.listen(5000, (req, res) =>
{
    console.log("서버 실행중..");
});

서버를 보다 쉽게 구현해줄 프레임워크인 express와 로그인 시에 사용자 정보를 데이터베이스를 통해서 구현할 것이므로, mongoose라는 몽고DB 모듈을 가져옵니다. 또한 클라이언트에서 넘어오는 인자들을 파싱하기 위한 body-parser모듈을 선언합니다.

다음으로, 라우팅과 몽고DB 등을 설정하고 서버를 실행합니다.

위와 같은 기본틀에서 시작합니다. 먼저 Passport모듈을 사용하기 위해서는 npm을 통해서 설치를 진행하여야 합니다. 또한 기타 인증 작업을 쉽게 구현해주는 모듈들을 추가로 설치해줍니다.

npm install passport passport-jwt jsonwebtoken bcryptjs

여기서 각 모듈들의 역할은 다음과 같습니다.

  • passport : 로그인 인증을 쉽게 도와주는 모듈입니다.
  • passport-jwt : passport모듈을 통해서 인증시에 클라이언트에 json web token을 생성시키는 모듈입니다. jwt을 이용하면 세션처럼 사용자가 로그인이 되어있는지, 로그인이 만료 되었는지 등을 확인 할 수 있습니다.
  • jsonwebtoken : passport-jwt에서 만든 jwt을 다루기 위한 모듈입니다.
  • bcryptjs : 보안을 위한 모듈입니다. 이 모듈을 이용하여 입력받은 비밀번호를 해쉬코드로 변환할 수 있습니다.

모두 설치 되었다면, /config 폴더에 keys.js 에 내용을 추가하여 다음과 같이 변경합니다.

/config/keys.js

module.exports = {
    mongoURI: 'mongodb://tester:test1234@mlab주소/데이터 베이스',
    secretOrKey: 'secret' // 정하고싶은 암호로 설정
};

secretOrKey에 암호화할때 쓰일 문자열을 입력합니다. 그다음, /config 디렉터리에
passport.js 파일을 생성하고 다음과 같이 작성합니다.

/config/passport.js

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');
const User = mongoose.model('users');
const keys = require('./keys').secretOrKey;
const opts = {};

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys;

module.exports = passport =>
{
    passport.use(new JwtStrategy(opts, (jwt_payload, done) =>
    {
        User.findById(jwt_payload.id).then(user =>
        {
            if (user)
            {
                return done(null, user);
            }
            return done(null, false);
        }).catch(err => console.log(err));
    }));
};

passport-jwt로 부터 필요한 모듈들을 가져옵니다. 또한 현재 앱에서 연결된 데이터베이스에서 users 모델을 가져옵니다.

그 다음, 위에서 작성했던 암호문을 가져오고,

opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

이부분을 통해서 클라이언트에서 서버로 jwt를 전달하는 방식을 설정합니다.
위의 방식은 header에 Authorizationi이라는 키이름에 BearerToken을 전달하는 방식입니다.
이에대한 설명은 조금 뒤에 하도록 하겠습니다.

마지막으로, 외부에서 passport파일을 {} 내용과 같이 사용하도록 설정합니다.
만약 jwt에 들어있는 id값을 읽었을 때, (현재 로그인된 사용자의 id) 사용자 데이터베이스에서 id가 일치하는 항목이 있다면, 해당하는 user를 반환하도록 설정합니다.

다음으로 server.js 를 수정합니다. passport를 미들웨어로 사용하기위해서는 server.js 에 미리 미들웨어를 사용하겠다는 명시를 해주어야합니다.

// 모듈 로드
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var passport = require('passport');
// 초기화 파트
const app = express();
const users = require('./routes/api/users');

// 미들웨어 설정 파트 
app.use(bodyParser.urlencoded(
{
    extended: false
}));

app.use(bodyParser.json());
app.use(passport.initialize());

// 몽고DB 설정 파트
const db = require('./config/keys').mongoURI;
mongoose.connect(db,
{
    useNewUrlParser: true
}).then(() => console.log("몽고 DB가 연결되었습니다.")).catch(err => console.log(err));

// 패스포트 모듈 설정
require('./config/passport')(passport);

// 라우팅 파트
app.use('/api/users', users);

// 서버 실행
app.listen(5000, (req, res) =>
{
    console.log("서버 실행중..");
});

중간에 app.use를 사용하여 passport모듈을 초기화(시작) 하는 것을 볼 수 있습니다.

여기까지하면 passport를 사용하기 위한 준비 과정이 드디어 완성된것입니다...!!

다음에는 passport모듈을 통해서 실제로 jwt을 다루고, 로그인 기능을 구현해 보겠습니다.

반응형

댓글