반응형

node.js에서 ejs를 사용해 POST로 데이터를 넘기는 방법입니다.

관리자만 사용하기 위해 필요한 페이지를 만들기 위해 node.js에서 ejs를 사용했습니다. ( ex: 공지사항 )

FrontEnd에서 관리자 페이지를 생성 하게되면 어쩌다 url을 입력해 들어가지는 상황이나 잘못하면 누군가에 의해 뚫리는 상황이 올 수도 있습니다. 이럴때 좀 더 안전하게 사용하는 방식을 사용하기 위해 BackEnd에 ejs를 사용하게 되었습니다.

 

ejs를 사용하는 방법 바로가기

 

app.js

...

app.use('/api/notice', '/noticeController');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.get("/notices", (req, res) => {
    res.render(__dirname+"/views/view.ejs");
})

...

ejs 파일을 렌더링 해주기 위해 사용했습니다. ( ejs를 사용하는 방법은 위 바로가기를 확인해주세요. 여기서는 전부 생략했습니다. )

 

./views/view.ejs

<form method="post" action="/api/notice/create">
    <label for="name">이름: </label>
    <input type="text" id="name" name="name" required>
    <br>
    <label for="email">이메일 :</label>
    <input type="email" id="email" name="email" required>
    <br>
    <input type="submit" value="Submit">
</form>

간단하게 이름과 이메일을 보내는 formData형식입니다.

 

./views/view.ejs

<body>
    <div>
        <input type="text" id="inputName" onchange="nameChange()" />

        <input type="email" id="inputEmail" onchange="emailChange()" />

        <button onclick="create()">보내기</button>
    </div>
</body>

<script>
    let data = {
        name: "",
        email: ""
    }
    
    function nameChange() {
        data.name = document.getElementById("inputName").value;
    }
    
    function emailChange() {
        data.email = document.getElementById("inputEmail").value;
    }
    
    function create() {
        fetch("/api/notice/create", {
            method: "POST",
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(notice)
        })
        .then(res => res.json())
        .then(data => {
            console.log(data);
        })
    }
</script>

fetch를 사용하여 데이터 보내주기

 

./api/notice/create

const router = plugins.express.Router();

router.post("/create", (req, res) => {

    const item = req.body;

    console.log(item);
    console.log("들어왔는지 확인하기");

    res.status(200).json({
        code: "y"
    })
})

module.exports = router;

post형식으로 보냈기때문에 post형식으로 받아주고, req.body를 통해서 값을 받아오면 됩니다.

 

반응형
반응형

NodeJS에서 Multer를 사용하는 방법입니다.

파일을 보내서 저장하는 방법을 기록한 내용입니다.

 

npm

npm install multer

 

FrontEnd

먼저 Front에서 폼데이터를 사용해 내용을 넘겨줘야합니다. ( if문은 TypeScript라서 추가해준 내용입니다. )

const formData = () => {
    const formData = new FormData();
    
    // 아이디 | 이미지 | 제목
    formData.append("_id", "고유 아이디");
    if (enrollData.coverImage) formData.append("coverImage", enrollData.coverImage);
    formData.append("coverTitle", "제목");
    
    // 배열을 보내줄때는 for문을 사용해서 하나씩 보내줍니다.( ex: )
    for (let i = 0; i < enrollData.images; i++) formData.append("images", enrollData.images[i]);
}

api.post("enroll/createCover", formData)
.then(res => {
    if (res.data.code === "y") {
        console.log(res.data);
    }
})

 

BackEnd

업로드 서비스를 따로 만들어주었습니다.

 

uploadService.js

서버에 새로운 폴더를 만들어 그곳에 저장합니다.

const multer = require("multer");
const path = require("path");

const coverUpload = multer({
    storage: multer.diskStorage({
        destination: function(req, res, cb) {
            cb(null, "covers/");
        },
        filename: function (req, file, cb) {
            cb(null, new Date().valueOf() + path.extname(file.originalname));
        }
    })
})

 

Controller.js

formData와 이름을 맞춰주면 됩니다.

const ...

// Single
router.post("/createCover", coverUpload.single("coverImage"), async (req, res) => {
    
    const file = = req.file;
    
    console.log(file);
}

// Fields
router.post("/create", enrollUpload.fields([{ name: "coverImage" }, { name: "imagesFile" }]), async (req, res) => {
    
    const { coverImage, imagesFile } = req.files;
    
    console.log(coverImage);
    console.log(imagesFile);
}

// Array
router.post("/create", enrollUpload.array("images"), async (req, res) => {

    const files = = req.files;
    
    console.log(files);
}

 

중간중간 생략한 부분들이 많아서 일단 이렇게 정리해두고 나중에 다시 정리해서 올릴 생각입니다. ( __ )

반응형
반응형

NodeJS에서 MySQL을 사용할 때 다중쿼리를 처리하는 방법에 대한 내용입니다.

NodeJS에서 다중 쿼를 처리를 하려면 하나의 쿼리문을 처리 한 이후에 콜백 함수를 사용해서 처리해야 합니다.

물론 두세개 정도 쿼리문을 처리할 때는 복잡하지 않지만 더 늘어날수록 코드가 매우 복잡해지기 때문에 이를 해결하고자 mysql 모듈에는 다중쿼리를 처리해주는 내용이 있습니다.

 

NodeJS + MySQL 연결 바로가기

 

npm

npm install mysql2

 

mysql.createConnection부분

const mysql = require('mysql2');

const conn = mysql.createConnection({
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    dateStrings: "date",
    // 아래부분을 추가해줍니다.
    multipleStatements: true
});

module.exports = conn;

mysql에서 multipleStatements부분을 true로 추가시켜줍니다.

 

test.js

const _sql_one = `SELECT * FROM test WHERE type='test';`;
const _sql_two = `SELECT * FROM test WHERE age='16';`;

conn.query(_sql_one + _sql_two, (err, result) => {
    if (err) return console.log("Error Controller");
    
    // result[0]: _sql_one 내용
    // result[1]: _sql_two 내용
    console.log(result[0]);
    console.log(result[1]);
})

이런식으로 배열형태로 가져오게 됩니다.

multipleStatements부분을 추가하지 않은 상태로는 에러가 발생하기 때문에 꼭 추가를 시킨 이후에 사용을 해줘야합니다.

 

반응형
반응형

NodeJS에 MySQL을 사용하는 방법입니다.

MySQL 유저 생성 바로가기

NodeJS 서버 열기 바로가기

.env 파일 만들기 바로가기

위에서 생성한 유저를 NodeJS서버와 연결하는 방법입니다.

 

npm

npm install mysql2

 

app.js

const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);

...

// DB
const conn = require('./config/conn');
conn.connect(err => {
    if (err) return console.log("Connection Error", err);

    console.log("DB Connect");
})

// SERVER
const port = 8080;
app.set('port', port);
server.listen(port, () => {
    const message = `
        [ Test Server ]
        Running Port : localhost:${port}
        Start Time : ${Date()}
    `;
    console.log(message);
});

app.js안에 mysql정보를 바로 넣어 줄수도 있지만, 조금 더 깔끔하기 위해 mysql정보는 밖으로 빼주었습니다.

 

./config/conn.js

const mysql = require('mysql2');

const conn = mysql.createConnection({
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    dateStrings: "date",
});

module.exports = conn;

 

MySQL 유저를 생성할 때 나온 내용들을 추가해줍니다.

.env 파일을 활용하여 위처럼 정보를 조금 더 안전하게 보호할 수 있습니다.

반응형
반응형

서버인 NodeJS의 Express 정적폴더 내부에 존재하는 내부 파일을 프론트에서 불러올 수 있도록 하는 방법입니다.

NodeJS 서버가 실행된다는 가정하에 작성된 내용입니다.

NodeJS 서버 여는방법 바로가기

 

const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);

...

// 프론트와 폴더 연결해주기
app.use("/profiles", express.static("profiles"));

// SERVER
const port = 8080;
app.set('port', port);
server.listen(port, () => {
    const message = `
        [ Test Server ]
        Running Port : localhost:${port}
        Start Time : ${Date()}
    `;
    console.log(message);
});

위처럼 app.use를 통해 static 폴더를 연결해주면 profiles폴더의 파일들을 프론트에서 불러올 수 있게 됩니다.

 

반응형
반응형

NodeJS를 사용하면서 EJS를 적용하는 방법입니다.

오랜만에 NodeJS에서 EJS를 사용할 일이 생겨서 작성하는 내용입니다.

NodeJS 서버가 실행된다는 가정하에 작성된 내용입니다.

( ejs파일을 부른다음 json파일까지 불러서 화면에 띄워주는 방법까지 입니다. )

NodeJS 서버 여는방법 바로가기

 

npm

npm install ejs --save

 

app.js

const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);

const fs = require('fs');

app.get('/', (req, res) => {
    fs.readFile("file.json", "utf-8", function (err, data) {
        let saveData = JSON.parse(data);

        res.render(__dirname+"/views/index.ejs", {saveData});
    });
});

// SERVER
const port = 8080;
app.set('port', port);
server.listen(port, () => {
    const message = `
        [ Test Server ]
        Running Port : localhost:${port}
        Start Time : ${Date()}
    `;
    console.log(message);
});

 

file.json

{
    "data": [
        {
            "title": "제목",
            "contents": "내용"
        },
        {
            "title": "제목",
            "contents": "내용"
        },
        {
            "title": "제목",
            "contents": "내용"
        },
        {
            "title": "제목",
            "contents": "내용"
        },
        {
            "title": "제목",
            "contents": "내용"
        }
    ]
}

 

./views/index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>
        <ul>
            <!-- for문 -->
            <% for(let i=0; i<saveData.data.length; i++) { %>
                <li><%= saveData.data[i].title %></li>
                <!-- if문 -->
                <% if (saveData.data[i].contents.indexOf("제") > -1) { %>
                    <li style="color: red;"><%= saveData.data[i].contents %></li>
                <% } else { %>
                    <li style="color: blue;"><%= saveData.data[i].contents %></li>
                <% } %>
            <% } %>
        </ul>
    </div>
</body>
</html>

html형식으로 사용가능합니다.

ejs를 사용하면 react나 angular처럼 html내부에서 for문, if문 등을 사용가능합니다. ( 이 때문에 사용한다고 해도 과언이 아닐듯합니다..! )

ejs에서 for문을 사용할 때는 주의를 해주어야 하는 부분들이 있습니다.

// 작동안함
for (let i = 0; i < saveData.data.length; i++) {}
// 작동함
for (let i = 0; i<saveData.data.length; i++) {}

예를 들어, 위에 for문의 차이는 띄어쓰기 차이입니다. 저도 평소에는 첫번째 for문처럼 띄어쓰기를 사용하지만 ejs에서는 부등호 표시가 걸리면서 작동을 하지 않게 됩니다.

그리고 위쪽에 <li>~</li>부분에 <%= %>이런식으로 표현한 부분이 있는데, 이런부분들도 조심해야 할 부분들입니다.

 

이처럼 ejs를 사용할 때는 은근히 주의해줘야 할 점들이 있습니다. 이점들만 주의해서 사용한다면 상당히 편리하면서 간단하게 페이지를 생성할 수 있습니다.

 

ejs 태그에 대하여 ( 자주 사용하지 않다보니 까먹어서 적어두는 내용입니다. )

  • <%제어 흐름을 위한 'Scriptlet' 태그, 출력 없음
  • <%_'Whitespace Slurping' 스크립틀릿 태그, 그 앞의 모든 공백 제거
  • <%=값을 템플릿으로 출력(HTML 이스케이프됨)
  • <%-이스케이프 처리되지 않은 값을 템플릿으로 출력합니다.
  • <%#주석 태그, 실행 없음, 출력 없음
  • <%%리터럴 '<%' 출력
  • %>일반 종료 태그
  • -%>트림 모드('newline slurp') 태그, 줄 바꿈 다음 트림
  • _%>'Whitespace Slurping' 종료 태그, 그 뒤의 모든 공백 제거

ejs 홈페이지에서 가져온 내용입니다. ( 사용방법, 옵션 등등 많은 내용들을 확인할 수 있습니다. )

ejs 홈페이지 바로가기

 

반응형

'NodeJS > NodeJS' 카테고리의 다른 글

[ NodeJS ] NodeJS + MySQL 연결하기  (0) 2023.05.30
[ NodeJS ] Express 정적폴더 내부 파일 불러오기  (0) 2023.05.30
[ NodeJS ] nodemailer 사용하기  (0) 2022.11.30
[ NodeJS ] fs  (0) 2022.07.16
[ NodeJS ] crypto 암호화 복호화  (0) 2022.07.15
반응형

npm

$ npm install nodemailer

 

// 관리자 정보
const email = {
    host: "smtp.naver.com",
    service: 'naver',
    auth: {
        user: "user@naver.com",
        pass: "password"
    }
};

// 메일 옵션
let mailOptions = {
    from: '보내는사람',
    to: '받는사람',
    subject: '제목',
    html: '내용'
};

const transport = plugins.nodemailer.createTransport(email);

transport.sendMail(mailOptions, function(err, info) {
    // 에러일 경우
    if (err) console.log(err);
    // 성공적으로 보내질 경우
    else console.log(info.response);
});

 

네이버를 사용할 경우

메일함 -> 메일함 관리 -> POP3/IMAP 설정 -> 사용함

위처럼 설정해주지 않으면 아래처럼 에러가 뜨게됩니다.

Error: Invalid login: 535 5.7.1 Username and Password not accepted RjdTJcbgTMGcgN72tnNj9Q - nsmtp ...

 

구글을 사용할 경우

구글 보안 바로가기

위 링크에서 2단계 인증을 해주면 아래처럼 앱 비밀번호를 설정할 수 있게됩니다. 이후 앱 비밀번호를 작성하고, nodemailer의 비밀번호로 넣어주면 작동하게 됩니다.

반응형
반응형

fs 공식문서 바로가기

 

fs( File System ) 모듈

fs 모듈은 파일 입출력 처리를 할 때 사용하는 모듈입니다.

 

 

fs 모듈 불러오기

const fs = require('fs');

 

 

비동기 함수 VS 동기 함수

fs 모듈은 비동기( Asynchronous ) API와 동기( Synchronous ) API를 모두 제공하고 있습니다.

따라서 본인이 작성하는 프로그램의 성격을 고려하여 둘 중 어떤 API가 적합한지 판단해야합니다.

 

fs 모듈에서 제공하는 비동기 메서드는 마지막 인자로 콜백 함수를 받고 아무 값도 반환하지 않습니다. 반면 fs 모듈에서 제공하는 동기 메서드는 결과값을 리턴하며, 예외( exception )를 일으킬 수 있습니다. 동기 메서드의 이름은 Sync로 끝이 나기 때문에 쉽게 비동기 메서드인지 동기 메서드인지 구분이 가능합니다.

 

 

디렉토리 생성하기

fs 모듈을 이용해서 디렉토리 만드는 방법입니다. 비동기로 디렉토리를 만들 때는 mkdir() 메서드를 사용합니다.

( mac에서 터미널로 파일 만드는것과 비슷합니다. )

 

디렉토리 생성하기

// 비동기 ver
fs.mkdir("file-name", (err) => console.log(err));


// 동기 ver
try {
    fs.mkdirSync("file-name");
} catch (err) {
    console.log(err);
}

 

 

디렉토리 삭제하기

// 비동기
fs.rmdir("file-name", (err) => console.log(err));

// 동기
try {
    fs.rmdirSync("file-name");
} catch (err) {
    console.log(err);
}

 

 

파일 생성하기

// 파일 생성하기
const file = 'file.html';
fs.open(file, 'w', function(err, fd) {
    if(err) throw err;
    console.log('파일 열기');
});

 

파일 Options

r 파일을 읽기 상태로 열며 해당 파일이 없으면 에러를 발생시킵니다.
r+ 파일을 읽기 / 쓰기 상태로 파일을 열며 파일이 없으면 에러를 발생시킵니다.
w 파일을 쓰기 상태로 열며 파일이 존재하지 않으면 생성, 존재하면 내용을 지웁니다.
w+ 파일을 읽기 / 쓰기 상태로 열며, 존재하지 않으면 생성, 존재하면 내용을 지웁니다.
a 파일을 추가 쓰기 상태로 열며, 파일이 없으면 만들어줍니다.
a+ 파일을 추가 읽기 / 쓰기 상태로 열며, 파일이 없으면 만들어줍니다.

 

 

파일 확인하기

// 파일 확인하기
fs.exists('file.html', function(exists) {
  console.log(exists ? "있습니다." : "없습니다.");
});

exists() 메서드는 파일이 존재하는지 확인해줍니다.

 

 

파일 이름 변경하기

// 파일 이름 변경
fs.rename('file.html', 'file2.html', function(err) {
    if(err) throw err;
    console.log('변경 성공');
});

rename() 메서드는 파일의 이름을 변경해줍니다. 해당 파일이 없거나 권한이 없다면 에러가 발생합니다. 또한 변경하려는 파일의 이름과 같은 파일이 존재하면 에러가 발생합니다.

 

 

파일 삭제하기

// 파일 삭제
fs.unlink('file2.html', function(err) {
    if(err) throw err;
    console.log('파일 삭제');
});

해당 파일이 없거나 권한이 없으면 에러가 발생합니다.

 

 

파일 읽기

// 파일 읽기
fs.readFile('file2.html', 'utf8', function(err, data) {
    console.log(data);
});

 

 

파일 내용 쓰기

// 파일 내용 쓰기
const write = '파일에 적용시킬 내용';
fs.writeFile('file2.html', write, 'utf8', function(err) {
    if(err) throw err;
    console.log('내용 적용');
})

writeFile() 메서드는 파일 내부에 내용을 작성합니다. 파일이 존재하지 않으면 파일을 생성후에 작성해줍니다.

파일 내용이 이미 있으면, 이전 내용이 삭제되고 새로운 내용이 작성됩니다.

 

 

파일 내용 이어쓰기

// 파일 내용 이어쓰기
const write2 = '이어쓰기'
fs.appendFile('file2.html', write2, function(err) {
    if(err) throw err;
    console.log('이어쓰기 성공');
});

appendFile() 메서드는 파일에 내용을 이어서 작성해줍니다. 파일이 존재하지 않으면 파일을 생성후에 작성해줍니다.

 

반응형
반응형

crypto 바로가기

 

crypto 모듈을 사용해서 암호화, 복호화 시키기

 

암호화 방법은 단방향 암호화와 양방향 암호화 두가지가 있습니다.

 

1. 단반향 암호화

비밀번호는 보통 단반향 암호화를 사용합니다. 단방향 암호화는 복호화를 할 수 없는 암호화 방식입니다.

복호화란 암호화된 문자열을 암호화 되기전의 문자열로 돌려놓는 것을 의미합니다. 그러므로 단방향 암호화를 사용하면 원래 문자열이 무엇인지 알 수 없습니다.

 

단방향 암호화를 사용하는 이유는 굳이 사용자의 비밀번호를 다시 복호화 할 필요가 없기 때문입니다.

DB에 저장되어있는 암호와 비교를 할 때는 단방향 암호화를 통해서 비교하면 되기 때문에 문제가 없습니다.

즉, 기존 비밀번호는 어디에도 남지 않고 암호화된 문자열로만 비교하는 방법입니다.

 

단방향 암호화는 해시 알고리즘을 사용합니다. 해시는 임의의 크기를 가진 문자열을 고정된 길이의 다른 문자열로 바꾸는 것을 말합니다.

 

해시 함수 사용하기 예

const password = 'onepassword'
const password2 = 'twopassword'

const base64crypto = password => {
    console.log(plugins.crypto.createHash('sha512').update(password).digest('base64'))
}

base64crypto(password)
base64crypto(password2)

// password
UWo1TmcJr6ojrARyhC/er6ffsmnhkfXr4uuknTq+SEQqAghTPnClXmwENwJL3+6I6teJyqimDaaDYSH80TdqOA==

// password2
ZMlGJKKiGj9OJ/5tvE2atqA0edtAUP9C62Td3xh4+VY+KezMWwC/IoJGjQHeR3D25XmdJSxyxxB1xdh9XcXZIg==

위처럼 암호화된 문자열로 나오게 됩니다.

 

 

단방향 해시 함수의 문제점

단방향 해시 함수는 원본 문자열을 찾거나 동일한 효과의 문자열을 찾을 수 있습니다. 이와 같은 암호화된 문자열의 목록을 '레인보우 테이블'이라고 합니다.

 

이러한 문제점을 해결하기 위해 salting과 key strtching을 사용하여 보완합니다.

기존 문자열에 추가로 덧붙이는 문자열을 salt라고 합니다. 기존 문자열에 salt를 덧붙이고, 암호화된 문자열(다이제스트[digest])을 생성하는 것을 salting이라고 합니다.

 

기존 문자열의 다이제스트를 생성하고 생성된 다이제스트를 통해서 다시 다이제스트를 생성하는 방법을 '키 스트레칭(Key Stretching)'이라고 합니다.

이렇게 입력된 패스워드를 동일한 횟수 만큼 해시화 해야 입력한 패스워드와 암호화된 패스워드 일치여부를 확인 할 수 있습니다.

 

crypto는 randomBytes, pbkdj2 메소드를 지원합니다.

 

randomBytes, pbkdj2 메소드 사용 예

const password = 'onepassword'
const password2 = 'twopassword'

const base64crypto = password => {
    plugins.crypto.randomBytes(64, (err, buf) => {
        const salt = buf.toString('base64');

        plugins.crypto.pbkdf2(password, salt, 100, 64, 'sha512', (err, key) => {
            console.log(salt);
            console.log(key.toString('base64'));
        });
    });
};

base64crypto(password)
base64crypto(password2)

// ZdhwgYgTUXqCBPIZSK8uIBwubTQh1cu0BCQpGBR33+JAF7gS97Krm4rU9lB68yPNqawFLWlKDa/ZaB60cR6Zxg==
// 6iiBdb49tJusPUbkxoeqO5ZMU/y0M9OZWyHqklEKZfe/TRKRsbG9jJucE3xUHUYSBcTP3x1umFJTlzdvgJNaEw==

// 5VdFDV0q/XBIQJ0RmkzM/xFz7tVwSXUvjffzSExrD4jKsFLRcSq2o2uh4FE9qsP+WIYDUV46dGP+N/VXj9Fevg==
// 2FHpJEGChf3dbTO2EQExdxSFY8C8mKmWscHNdfpRyKesPgabfruW7B88MUuOXYKwl9eJQYcc1AaTisu0r3g8Tw==

위처럼 randomBytes 메소드에서 64바이트 길이의 임의 문자열(salt)을 생성합니다. pbkdf2 메소드는 순서대로 비밀번호, salt, 반복 횟수, 출력될 바이트 수, 해시 알고리즘을 parameter로 받아서 처리합니다. 위는 키 스트레칭을 100번 반복한 것입니다.

 

pbkdf2 메소드는 간단하게 사용할 수 있지만, bcrypt나 scrypt보다 취약하기에 더 나은 보안이 필요할 경우 사용합니다.

:: 실행할 때마다 값이 다르게 출력되는 이유는 randomBytes를 통해 salt의 값이 매번 변경되기 때문입니다.

:: bcrypt : 패스워드 저장을 목적으로 설계되었습니다. openBSD에서 기본 암호 인증 메커니즘으로 사용되고 있습니다. 단 입력값이 72byte인 제약이 있습니다.

:: scrypt : pbkdf2와 유사하게 salting과 key Stretching을 반복하며, digest를 생성할 때 메모리 오버헤드를 갖게끔 설계가 되어 있어서 억지기법공격을 시도할 때 병렬화 처리가 어렵습니다.

 

 

 

양방향 암호화

양방향 암호화에는 대칭형 암호화와 비대칭형 암호화가 있습니다. 양방향 암호화는 암호화된 문자열을 기존 문자열로 복호화 할 수 있는 암호화 기법입니다. 암호화된 문자열을 복호화 하기 위해 암호화 할 때 사용했던 키와 같은 것을 사용해 주어야 합니다.

 

양방향 암호화 예

const password = 'onepassword'
const password2 = 'twopassword'

const key = 'helloworld';

const encoder = (password, key) => {
    const encrypt = plugins.crypto.createCipher('des', key);
    const encrypt2 = encrypt.update(password, 'utf8', 'base64') + encrypt.final('base64');

    console.log(encrypt2);
    return encrypt2;
}

const decoder = (password, key) => {
    const decrypt = plugins.crypto.createDecipher('des', key);
    const decrypt2 = decrypt.update(password, 'base64', 'utf8') + decrypt.final('utf8');
    console.log(decrypt2);
}

const en = encoder(password, key);
decoder(en, key);
const de = encoder(password2, key);
decoder(de, key);

// kNiXXsNIwFCkNTJ5jyw5Hg==
// onepassword

// bYPMKWrEMSZup9dtg4VllA==
// twopassword

위 코드처럼 암호화 했던 문자열이 기본 문자열로 복호화 되는 것을 알 수 있습니다.

 

반응형

'NodeJS > NodeJS' 카테고리의 다른 글

[ NodeJS | EJS ] EJS 사용하기 ( Feat. json파일 불러오기 )  (0) 2023.05.24
[ NodeJS ] nodemailer 사용하기  (0) 2022.11.30
[ NodeJS ] fs  (0) 2022.07.16
[ Node ] nodemon 사용하기  (0) 2022.07.07
[ Node ] webpack 사용하기  (0) 2022.07.03
반응형

npm nodemon 바로가기

 

nodemon

노드몬은 디렉토리의 파일 변경이 감지되면  노드 프로그램을 다시 시작해줍니다.

 

npm install

$ npm install nodemon -g

or

$ npm install nodemon

노드몬은 전역으로 설치하는것을 추천합니다.

 

전역으로 설치했을 경우 app.js를 만든 서버폴더로 이동해서 'nodemon app'을 입력해주면 변경이 있을때마다 재시작을 해줍니다.

 

노드몬 실행

$ nodemon app

 

전역 설치를 하지 않았을 경우 'nodemon app'이 먹히지 않았습니다.

전역 설치로 다시한번 해주던가, package.json으로 이동해서 scripts를 변경해줍니다.

 

package.json

"scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
},

key값은 임의로 지정해둔 것입니다. 저는 dev라고 지었기 때문에 실행할때 dev를 붙여줍니다.

 

노드몬 실행

$ npm run dev

 

반응형

'NodeJS > NodeJS' 카테고리의 다른 글

[ NodeJS | EJS ] EJS 사용하기 ( Feat. json파일 불러오기 )  (0) 2023.05.24
[ NodeJS ] nodemailer 사용하기  (0) 2022.11.30
[ NodeJS ] fs  (0) 2022.07.16
[ NodeJS ] crypto 암호화 복호화  (0) 2022.07.15
[ Node ] webpack 사용하기  (0) 2022.07.03

+ Recent posts