업데이트:

태그: , , ,

카테고리:

사용 기술 스택

  1. mariadb
  2. express
  3. pug


프로젝트 개요

  • 사용자 개인의 데이터베이스 접속정보를 입력받아 사용자 DB의 테이블들을 분석해야한다.
  • 분석은 도메인 스캔이 있다.

  • 사용자 개인의 데이터 베이스 입력은 IP, PORT, USERNAME, USERPASSWORD, DBNAME, DBTYPE이 있다.
    • DB는 mssql, mysql(mariadb)일 수 있다.
    • USERNAME과 USERPASSWORD는 데이터베이스 내 사용자계정 정보이다.
    • IP와 DB이름, DB종류, 사용자 계정명으로 시스템사용자가 식별된다.


로그인

mysql, mssql

  1. DB에 접속할 정보를 configuration해준다.
const getDbConfigByLoginInfo = (loginInfo) => {

	if (loginInfo.dbKind == 'MSSQL')
	{
		return ({
			user : loginInfo.dbUser,
			password : loginInfo.dbPassword,
			database : loginInfo.dbName,
			server : loginInfo.dbHostIp,
			port : parseInt(loginInfo.dbPort) || 1433
		})
	}
	else //mariadb, mysql용
	{
		return ({
			user : loginInfo.dbUser,
			password : loginInfo.dbPassword,
			database : loginInfo.dbName,
			host : loginInfo.dbHostIp,
			port : parseInt(loginInfo.dbPort) || 3306
		})
	}
}

export default getDbConfigByLoginInfo;


  1. 연결 비동기처리를 위해 async~await문법으로 connection 객체를 얻어서 연결된 DB에 쿼리를 날려 결과를 받아올 수 있다.
const mariadb = require('mariadb');

const MariaMyLogin = async (config, query) => {
	const conn = await mariadb.createConnection(config);
	console.log("maria connected");
	if (query)
	{
		try {
			const res = await conn.query(query);
			console.log("current user config:", config);
			console.log("get a result in query:", query, "res: ", res);
			return (res);
		} catch(e){
			console.log(e)
			throw(e);
		} finally {
			conn.end();
		}
	}
};

export default MariaMyLogin;



로그인 로직

  • 사용자 데이터베이스 관련 정보를 얻어서 로그인을 합니다.
  • 사용자 데이터베이스 관련해 정보를 백엔드 DB에서 가지고 있어야, 해당 사용자가 스캔했던 정보를 식별할 수 있습니다.
  • 회원가입 절차가 원래 필요한 이유는 사용자에게 고유한 식별자를 줌으로써 해당 값에 인덱스를 걸어 테이블에서 빠르게 사용자를 식별할 수 있다는 것에 있다.
  • 별도의 회원가입 절차가 없기때문에, 서버에 한 번이라도 로그인했던 사용자의 정보를 서버DB에 저장해주도록 합니다.


  1. FORM에서 사용자의 데이터 입력
  2. POST /login
  3. 해당 정보로 접속할 수 있는지 확인 -> 실패시 /로 리다이렉션
  4. 로그인 가능한 사용자인 경우, DB에 해당 사용자가 있는지 없는지 확인해야함.
  5. 사용자 개인 식별 : IP주소, 사용자명, 데이터베이스 종류, 데이터베이스 명
  6. 위의 값으로 서버DB의 tb_user에 값이 있는지 확인하고, 없으면 생성.
  7. user_seq를 로그인 세션에 저장한다.
  • 사용자 데이터베이스의 비밀번호를 어디에 저장할 것인가가 문제
  • 데이터베이스에 접속하는 쿼리를 날리기 위해서는 어딘가 사용자의 DB비밀번호가 저장되어있어야만하고, 이를 계속 사용해야하는 문제가 있다.
  • 따라서 서버의 세션 메모리에 저장해두려고한다.

  • 이제부터 세션의 user_seq를 사용할 수 있다.



테이블 속성 도메인 스캔

템플릿 생성

domain-scan


tableNames

  • pug에서 mixin은 변수에 대해 반복적인 작업을 하는 템플릿이다.
  • res.render의 매개변수로 던져진 tableNames에 대해 적용된다.
mixin tableNames(tableName)
    .tableName_wrapper
        a(href=`/domain-scan/${tableName}`).tableName_mixin=tableName



테스트테이블 생성

create table dump (
t1 int(10),
t2 float,
t3 double,
t4 boolean,
t5 bit,
t6 decimal,
t8 text,
t9 char(10),
t10 varchar(20),
t11 date,
t12 datetime,
t13 timestamp,
t14 boolean,
t15 binary,
t16 enum('N', 'Y')
);

domain-scan-result

  • 도메인 스캔 결과는 2가지 종류가 있다.
  • 수치속성과 범주속성이 있다.
  • 해당 속성들의 속성값들은 SHOW COLUMNS FROM ${테이블명};으로 확인할 수 있다.
  • 이 속성값들을 기준으로 테이블들의 속성을 수치속성과 범주속성으로 구분한다.
[
  {
    Field: 'pk',
    Type: 'int(11)',
    Null: 'YES',
    Key: '',
    Default: null,
    Extra: ''
  },
  {
    Field: 'test',
    Type: 'varchar(10)',
    Null: 'YES',
    Key: '',
    Default: null,
    Extra: ''
  },
  meta : [
	  ...
  ]
];
  • 이렇게 값을 리턴해주게되는데, SQL 문에서 조금 제약을 걸어 수치속성 int, float, double 속성만 가져오도록 할 수 있다.
    • 수치속성
        SHOW COLUMNS from ${id} 
        WHERE TYPE LIKE '%int%' 
        OR TYPE LIKE 'double%' 
        OR TYPE LIKE 'float%'
        OR TYPE LIKE 'boolean'
        OR TYPE LIKE 'bit'
        OR TYPE LIKE 'decimal';
      
    • 범주속성
            SHOW COLUMNS from ${id} 
            WHERE TYPE LIKE '%char%' 
            OR TYPE LIKE '%text%' 
            OR TYPE LIKE '%date%' 
            OR TYPE LIKE '%time%'
            OR TYPE LIKE 'binary'
            OR TYPE LIKE 'enum';
      

테이블 속성 편집



댓글남기기