본문으로 건너뛰기

2.1. Backend 서버 구성

인증/인가 모듈의 Backend 부분 설치 과정을 설명합니다. 인증/인가의 실제 기능을 수행하며 아래 환경을 권장합니다.

  • Node.js LTS 버전
  • PostgreSQL 11
  • CentOS 7

본 설치 가이드는 CentOS 7 환경에서 Node.js 16과 PostgreSQL 11을 사용하는 것으로 가정합니다.

2.1.1. Node.js 설치

# 시스템 패키지 업데이트
$ sudo yum -y update

# Node.js 설치에 필요한 패키지 설치
$ sudo yum -y install curl

# Node.js 14 RPM 저장소 추가
$ curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -

# Node.js 설치
$ sudo yum -y install nodejs

# Native Adon 빌드를 위한 도구 설치
$ sudo yum -y install gcc-c++ make

curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn

2.1.2. PostgreSQL 11 설치

# PostgreSQL 11 RPM 저장소 추가
$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# PostgreSQL 11 설치
$ sudo yum -y install postgresql11-server

# PostgreSQL 11 구동을 위한 초기 데이터 생성
$ sudo /usr/pgsql-11/bin/postgresql-11-setup initdb

# PostgreSQL 11 서비스 설치 및 자동 실행 등록
$ sudo systemctl enable postgresql-11
$ sudo systemctl start postgresql-11

2.1.2.1. (옵션) 외부 호스트에서 PostgreSQL 11로 접속 가능하도록 설정

PostgreSQL 11이 설치된 호스트(localhost)가 아닌 외부 호스트에서 접근 가능하도록 설정하는 방법입니다. 필요한 경우 구성하며, 필요하지 않다면 다음 단계로 넘어가도 됩니다.

1. pg_hba.conf 파일 변경

$ sudo vi /var/lib/pgsql/11/data/pg_hba.conf

pg_hba.conf 파일을 아래와 같이 수정. (...은 pg_hba.conf 파일에 작성되어져 있는 내용을 의미합니다.)

기존

...
host all all 127.0.0.1/32 ident
...

변경

...
host all all 0.0.0.0/0 md5

2. postgresql.conf 파일 변경

$ sudo vi /var/lib/pgsql/11/data/postgresql.conf

postgresql.conf 파일 중 listen_address 설정 변경. (...은 postgresql.conf 파일에 작성되어져 있는 내용을 의미합니다.)

...
listen_address = '*'
...

3. PostgreSQL 11 재시작

$ sudo systemctl service restart postgresql-11

2.1.3. PostgreSQL 사용자 및 DB 생성

인증/인가 모듈에서 사용할 계정 및 데이터베이스를 생성합니다. 관리자용 인증/인가 모듈과 일반 사용자용 인증/인가 모듈을 별도로 구성하는 경우 각각 생성합니다.

# 1. PostgreSQL shell 접속
$ sudo -i -u postgres psql

# 2. 인증/인가 모듈에서 사용할 DB 생성
\# CREATE DATABASE <사용할 DB명> ENCODING 'utf-8';

# 3. 2에서 생성한 DB의 사용자 생성
\# CREATE USER <사용자명> PASSWORD '<비밀번호>';

# 4. 2에서 생성한 DB의 소유권을 3의 사용자에게 위임
\# ALTER DATABASE <2의 DB명> OWNER TO <3의 사용자명>;

# 5. 2에서 생성한 DB의 모든 권한을 3의 사용자에게 위임
\# GRANT ALL ON DATABASE <2의 DB명> TO <3의 사용자명> WITH GRANT OPTION;

# 6. PostgreSQL shell 종료
\# \q

# 7. 위에서 생성한 사용자와 DB명으로 접속 확인
$ psql -h 127.0.0.1 -U <3의 사용자명> -d <2의 DB명>

2.1.4. Backend 서버 설치

이 장에서는 centos 사용자가 자신의 홈 디렉토리(/home/centos)에서 명령어를 실행한다고 가정합니다.

Backend 서버는 관리자용 인증/인가 모듈과 일반 사용자용 인증/인가 모듈용으로 개별 구성 가능하며, 두 모듈의 backend 서버는 별도의 디렉토리에 각각 구성해야 합니다.

2.1.4.1. Backend 서버 소스코드 다운로드

시티데이터허브 인증/인가 모듈 git 저장소의 smartcity_back 폴더가 bakend 서버 구현 부분을 담당합니다.

아래 명령어를 사용하여 소스코드를 다운받습니다.

# git 저장소를 복제하기 위한 명령어 패키지 설치
$ sudo yum -y install git

# 인증/인가 모듈 git 저장소 복제
$ git clone https://github.com/IoTKETI/citydatahub_security_module.git

2.1.4.2. Backend 서버 설정

smartcity_back/server_conf.json 파일은 서버 구동에 필요한 정보를 담고 있습니다. 아래는 server_conf.json 파일의 각 설정 항목에 관한 설명입니다.

{
"serverip": "Standalone IP",
"serverport": "Standalone PORT",
"dbUserId": "enter your DB ID",
"dbUserPwd": "enter your DB PASSWORD",
"dbHost": "IP of Database",
"dbName": "NAME of Database",
"dbPort": "PORT of Database",
"emalAccountID": "enter your email ID",
"emailAccountPwd": "enter your email PASSWORD",
"token_type": "enter token type JWE or JWS",
"program_type": "enter program type general or admin",
"default_url": "access URL of backend server"
}
  1. serverip: 인증/인가 모듈의 Backend 서버를 구동하는 호스트의 IP

  2. serverport: 인증/인가 모듈의 Backend 서버가 사용할 포트

  3. dbUserId: 2.1.3에서 생성한 PostgreSQL 사용자명

  4. dbUserPwd: 2.1.3에서 생성한 PostgreSQL 사용자의 비밀번호

  5. dbHost: PostgreSQL 서버의 IP 주소(로컬에 설치했을 경우 127.0.0.1)

  6. dbName: 2.1.3에서 생성한 PostgreSQL DB명

  7. dbPort: PostgreSQL 서버의 접속 포트(기본 5432)

  8. emailAccountId: 이메일 인증 사용 시, 이메일 전송에 사용되는 계정명(지메일 권장, 해당 계정은 인증메일의 발신자가 됨)

  9. emailAccountPwd: 이메일 인증 사용 시, 이메일 전송에 사용되는 계정의 비밀번호

  10. token_type: 인증/인가 모듈에서 사용될 Token 방식(JWE/JWS)

  11. program_type: 인증/인가 모듈 동작 방식(관리자용 인증/인가 모듈: admin, 일반 사용자용 인증/인가 모듈: general)

  12. default_url: OAuth2.0 인증에 사용되는 인증/인가 모듈 자체의 redirect URI (Frontend를 사용하는 경우: http://<Frontend IP>:<Frontend Port> 이며, 사용하지 않는 경우 빈 문자열 "")

2.1.4.3. Bakend DB 초기화

인증/인가 모듈에 사용할 데이터베이스에 관련 테이블을 생성하고 관리자의 계정을 생성합니다.

# Backend 서버 디렉토리로 이동
$ cd ~/citydatahub_security_module/smartcity_back

# Backend 서버 구동에 필요한 라이브러리 설치
$ npm install

# Backend DB 초기화 스크립트 실행
$ node initDB/createTable.js
Database connected..
Success!

Success! 메시지가 출력되면 정상적으로 테이블 및 관리자 계정이 생성된 것입니다.

관리자 계정의 기본 정보는 아래와 같습니다.

  • ID: admin
  • Password: admin45@

비밀번호를 변경할 경우 Frontend를 설치하여 변경할 수 있습니다.

2.1.5. 인증/인가 모듈 실행

2.1.5.1. 키쌍(keypair) 생성

keys 디렉토리에 있는 initKey를 실행하여 인증/인가 모듈에 필요한 키쌍을 생성합니다. 생성된 키쌍은 keys 폴더에 생성됩니다.

# Backend 설치 경로로 이동
$ cd ~/citydatahub_security_module/smartcity_back

# 키쌍 생성 스크립트 실행
$ node keys/initKey.js

Note: 관리자용 인증/인가 모듈과 일반 사용자용 인증/인가 모듈을 개별로 구성하는 경우 생성한 키쌍을 두 보안 모듈에서 사용할 수 있도록 복사해야 합니다.

2.1.5.2. PM2 설치

PM2를 사용할 경우 인증/인가 모듈을 더욱 효과적으로 관리 할 수 있습니다.

PM2를 이용하여 Node.js 프로세스를 관리하면 Backend 서버 프로세스에 이상이 생겨 종료된 경우 자동으로 실행시켜 줍니다. PM2 Cluster 기능을 사용하여 Backend 서버 프로세스를 여러 개 실행하여 성능을 향상시킬 수 있습니다.

# PM2 설치
$ sudo npm -g install pm2

# Backend 서버 경로로 이동
$ cd ~/citydatahub_security_module/smartcity_back

# Backend 서버 구동
$ pm2 start bin/www
[PM2] Starting .../citydatahub_security_module/smarcity_back/bin/www in fork_mode (1 instance)
[PM2] Done.

pm2 list 명령어를 입력할 경우 현재 실행 중인 프로세스의 목록이 출력됩니다.

pm2_list