Nodejs에서 Express와 Passport로 안전한 인증 구현하기

Nodejs에서 Express와 Passport로 인증

Node.js에서 Express와 Passport를 활용한 인증은 디지털 환경에서 사용자 신원을 확인하는 데 필수적인 시스템을 구축하는 방법을 제공합니다. 간단한 로그인 기능부터 시작해, 복잡한 인증 흐름까지 다양한 방법을 통해 안전하고 신뢰할 수 있는 인증 시스템을 만들 수 있습니다. 본 포스트에서는 Node.js와 Express 프레임워크, Passport 미들웨어를 활용하여 이러한 시스템을 구성하는 방법을 심도 있게 다루겠습니다. 이 과정에서는 각 단계에 대한 자세한 설명과 예시를 포함할 것입니다.

인증 시스템의 중요성

웹 애플리케이션에서 인증 시스템은 사용자의 데이터를 보호하고, 비즈니스의 신뢰성을 높이는 데 중요한 역할을 합니다. 개인 정보 유출이나 악의적인 접근을 방지하기 위해 사용자 인증 절차를 철저히 구축해야 합니다. Passport는 로컬 전략뿐만 아니라 OAuth와 같은 다양한 인증 방법을 지원하며, 여러 비즈니스 모델에 맞게 유연하게 적용할 수 있는 장점을 가지고 있습니다.

예제 미리보기

가상의 웹 애플리케이션을 개발하여, 이 애플리케이션의 사용자 인증 시스템을 구현할 것입니다. 사용자는 ID와 비밀번호를 통해 로그인하고, 세션 기반 인증을 통해 그들의 정보를 안전하게 유지할 수 있습니다. 또한, 로그아웃 기능도 포함하여 인증 세션을 종료할 수 있는 방법도 제공합니다.

단계 설명
1 Node.js와 Express 프레임워크 설치
2 Passport 미들웨어 구성
3 DB와의 연결 및 세션 처리
4 라우팅 설정 및 로그인 처리
5 로그아웃 처리
6 결론 및 향후 방향

환경 설정

Node.js 및 패키지 설치

Node.js에서 Express와 Passport를 사용하기 위해서는 먼저 Node.js가 설치되어 있어야 합니다. 그 후, 필요한 패키지들을 설치해야 합니다. 아래의 명령어를 통해 필요한 패키지를 설치할 수 있습니다.

bash
mkdir passport-practice
cd passport-practice
npm init -y
npm install express express-session body-parser passport passport-local express-mysql-session

위의 명령어는 새로운 프로젝트 폴더를 만들고, 이동한 후 package.json 파일을 생성하게 됩니다. 그리고 Express, Passport 관련 패키지를 설치할 수 있습니다.

프로젝트 구조 설정

프로젝트의 파일 및 폴더 구조는 다음과 같이 설정합니다:

📦 passport-practice
┣ 📂 node_modules
┣ 📂 webpage
┃ ┣ 📜 login.
┃ ┗ 📜 main.
┣ 📜 index.js
┣ 📜 package-lock.json
┗ 📜 package.json

위와 같은 구조로 프로젝트를 구성하여 각 파일이 무엇을 수행하는지 명확하게 파악할 수 있습니다.

데이터베이스 설정

예제에서는 MySQL 데이터베이스를 사용하겠습니다. 다음 SQL 명령어를 사용하여 사용자 정보를 저장할 수 있는 데이터베이스를 생성합니다.

sql
CREATE DATABASE session_test;

USE session_test;

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);

위 SQL 스크립트는 session_test라는 데이터베이스와 users라는 테이블을 생성합니다. 각 사용자는 고유한 ID, 사용자 이름 및 비밀번호를 가집니다. 데이터베이스에 연결할 수 있는 구조를 마련해두어야 합니다.

필드 데이터 타입 설명
id INT 사용자 고유 ID
username VARCHAR(255) 사용자의 사용자 이름
password VARCHAR(255) 사용자의 비밀번호

서버 구현

이제 본격적으로 서버를 구현해 보겠습니다. 아래의 코드는 Express 서버와 Passport 미들웨어 초기화를 포함한 서버 설정을 다룹니다.

javascript
const express = require(express);
const bodyParser = require(body-parser);
const session = require(express-session);
const MySQLStore = require(express-mysql-session)(session);
const passport = require(passport);
const LocalStrategy = require(passport-local).Strategy;

const app = express();
const PORT = 8080;

// MySQL 연결 설정
const options = {
host: localhost,
port: 3306,
user: root,
password: 1q2w3e4r!@,
database: session_test,
};

const sessionStore = new MySQLStore(options);

// 미들웨어 설정
app.use(session({
secret: secret key,
store: sessionStore,
resave: false,
saveUninitialized: false
}));

app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());
app.use(passport.session());

로그인 시 사용자의 ID 세션 저장

로그인 성공 시 사용자의 ID를 세션에 저장하고, 페이지 요청 시 사용자 정보를 가져오는 함수 설정도 필요합니다.

javascript
passport.serializeUser(function(user, done) {
done(null, user.id);
});

passport.deserializeUser(function(id, done) {
// 사용자 ID로 부터 사용자 정보를 가져오는 로직
// 예를 들어, DB에서 사용자 정보를 조회하여 done(null, user)를 호출
});

위의 코드는 사용자의 ID를 시리얼라이즈하고, 사용자가 요청을 할 때마다 그 사용자를 복원하는 과정입니다. 이러한 과정에서 데이터베이스 접근 방법도 알맞게 구현해야 합니다.

단계 내용
1 사용자의 ID를 세션에 저장
2 페이지 요청 시 사용자 정보 복원

로컬 로그인 전략 설정

이제 로컬 전략을 설정하는 단계입니다. 입력된 ID와 비밀번호가 데이터베이스의 정보와 일치하는지 확인하는 로직을 구현합니다.

javascript
passport.use(new LocalStrategy({
usernameField: username,
passwordField: password
}, function(username, password, done) {
// 사용자 정보 검증 로직
// DB에서 username과 password를 체크하는 쿼리 작성
}));

이 과정에서 데이터베이스의 사용자의 정보를 검증하고, 성공 시 done(null, user)로 인증을 수행합니다. 로그인 실패 시는 done(null, false)를 호출합니다.


라우팅 설정

이제 라우팅을 설정하여 로그인 요청 처리 및 메인 페이지로의 이동을 구현하겠습니다.

javascript
app.post(/login, passport.authenticate(local, {
successRedirect: /,
failureRedirect: /login
}));

app.get(/login, (req, res) => {
res.sendFile(__dirname + /webpage/login.);
});

app.get(/, (req, res) => {
if (!req.isAuthenticated()) return res.redirect(/login);
res.sendFile(__dirname + /webpage/main.);
});

위와 같이 라우팅을 추가하면 사용자가 로그인 성공 시 메인 페이지로 리다이렉트되고, 실패 시 로그인 페이지로 다시 돌아가게 됩니다.


로그아웃 처리

마지막으로 로그아웃 기능을 추가하여 사용자가 로그아웃할 수 있도록 설정합니다.

javascript
app.get(/logout, (req, res) => {
req.logout();
res.redirect(/login);
});

로그아웃 요청 시, 세션을 종료시키고 로그인 페이지로 리다이렉트되는 방식입니다. 이 과정을 통해 사용자 인증이 완전하게 구성됩니다.


결론

Node.js에서 Express와 Passport를 이용한 인증 시스템 구현 방법을 살펴보았습니다. Passport는 여러 전략을 지원하는 유연한 미들웨어로, 특히 로컬 인증을 필요로 하는 웹 애플리케이션에서 유용합니다. 이를 통해 안전하고 신뢰할 수 있는 사용자 인증 시스템을 구축할 수 있습니다.

앞으로도 다양한 인증 방식을 공부하며 더욱 깊이 있는 웹 개발 경험을 쌓아가면 좋겠습니다.


자주 묻는 질문과 답변

  1. Node.js와 Passport를 사용하여 인증 시스템을 구축하는 방법은 무엇인가요?
  2. Node.js 환경에서 Express와 Passport 미들웨어를 조합하여 사용자 인증 시스템을 손쉽게 구현할 수 있습니다. 필요한 모듈을 설치한 후 세션 관리와 인증 전략을 설정하는 과정을 통해 인증 기능을 추가할 수 있습니다.

  3. MySQL 대신 다른 저장소를 사용할 수 있나요?

  4. 네, MySQL 외에도 메모리 저장소나 파일 기반 저장소를 사용할 수 있습니다. 이 경우 세션 저장소 설정만 조정하면 간편하게 대체가 가능합니다.

  5. 로그인 기능은 어떻게 구현하나요?

  6. 로그인 기능은 사용자가 입력한 아이디와 비밀번호를 서버로 전송하도록 폼을 구성한 후, Passport의 로컬 전략을 통해 데이터베이스와 비교하여 인증을 수행하는 방식으로 구축할 수 있습니다.

  7. 로그아웃 기능은 어떻게 설정하나요?

  8. 로그아웃 기능은 사용자가 요청을 보내면, 세션에서 로그아웃 처리를 하고 로그인 페이지로 리다이렉트하는 방식으로 간단히 구현할 수 있습니다.

이 글을 통해서 Node.js 환경에서 Express와 Passport를 활용하여 어떻게 인증 시스템을 구축하는지에 대한 기초적인 이해를 돕고자 하였습니다.

Nodejs에서 Express와 Passport로 안전한 인증 구현하기

Nodejs에서 Express와 Passport로 안전한 인증 구현하기

Nodejs에서 Express와 Passport로 안전한 인증 구현하기