LTS 버전 : 안정적이고 신뢰되는 버전 

최근 버전은 모듈이 호환이 안되는 경우가 많다.

 

EC2는 명령어를 통해 설치를 해야한다.

데이터 베이스는 전부다 올리면 안된다. > gitignore을 통해 올리지 않는다.

 

JWT

를 하기 전에 알아야하는 개념은 OAuth에 대해 알아야한다.

OAuth(Open Authorization)

- 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 어플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준 

- 즉, 서드파티 어플리케이션이 사용자의 계정에 접근할 수 있는 권한을 부여하기 위한 프로토콜

 

현재는 OAuth 2.0을 사용하고 있다.

 

- JWT는 웹 애플리케이션에서 정보를 안전하게 전송하기 위한 간단한 방법

- 인증된 사용자를 식별하거나 데이터에 서명을 하여 변조를 방지하는 데 사용

- 모두가 열어봐서 확인할 수 있기 때문에 중요한 정보(EX 비밀번호)는 담으면 안된다.

- 암호화는 되어 있지만 언제든지 해석할 수 있다.

 

JWT 구성

- Header

- Payload

- Signature : 위의 두개의 조합에 비밀 키를 사용해 생성

 

작동 방식

주요함수

sign : 서버측에서 JWT를 생성할 때 사용

jwt.sign(payload, secretOrPrivateKey, [options, callback])

verify : 클라이언트나 서버에서 받은 JWT의 유효성을 검증할 때 사용

jwt.verify(token, secretOrPrivateKey, [option, callback])

사용하기

npm i jsonwebtoken

 

jwt 해보기

npm init -y

npm i express jsonwebtoken

으로 express와 jsonwebtoken을 설치하고 아래와 같이 적은 후

import express from 'express';
import jwt from 'jsonwebtoken';
const app = express();
const SECRET = 'secretkey'

app.use(express.urlencoded({extended:true}))
app.use(express.json())

app.post('/login', (req, res)=>{
    const { id } = req.body;
    const token = jwt.sign({id}, SECRET);
    console.log(token);
})

app.listen(8080, ()=>{
    console.log('연결')
});

서버를 연다 그 이후엥 포스트 맨에서 객체 형태로 보내면

vscode에 다음과 같은 문장이 온다 이를 jwt에 입력하면 어떤 것을 받았는지 확인할 수 있다.

 

토큰을 보내는 방법

저기서 토큰에 받은 토큰을 보내면 된다. 전부다 받을려면 

req.headers로 더 많은 정보를 맏을 수 있고, 토큰 값만 받을려면

app.post('/verify', (req, res) => {
    console.log(req.headers.authorization);
    const auth = req.headers.authorization;
    const token = auth.split(' ');
});

이와 같이 입력하고 다시 보내면 된다.

 

jwt 를 검증하는 코드

app.post('/verify', (req, res) => {
    console.log(req.headers.authorization);
    const auth = req.headers.authorization;
    const token = auth.split(' ');
    if( token[0] === 'Bearer') {
        jwt.verify(token[1], SECRET, (err, decoded) => {
            if( err ) {
                return res.send({result : false, message : '검증 실패'});
            }
            res.send({result : true, user : decoded});
        });
        // 여기서 바로 옆 애를 변수 선언하고 리턴을 할 경우 트라이캐치문으로 받아야하기 때문에 콜백함수 형태로 사용한다
    }else {
        res.send({ result : false, message: '올바른 인증 방식이 아닙니다.' })
    }
});

err의 명확한 상태값을 보내주기 위해선 

.status(오류 상황에 대한 숫자)

를 적으면 된다.

 

 

서버배포

인스턴스 생성 -> 인증키 ppk로 다운로드 (pem은 맥 전용) -> 탄력적 ip 할당 -> 만든 인스턴스에 연결 -> putty로 퍼블릭 ip 입력 후 포트 22에 연결 -> SSH의 크리덴션로 들어가 인증키 입력하여 open -> ubuntu 입력하여 연결

 

nginx 설치

sudo apt-get update -> 관리자 업데이트 apt-get 라잌 npm 

sudo apt-get install nginx -> nginx 설치

sudo systemctl start nginx -> 안되면 실행해보기

그래도 안되는데 어떻게 해야하지...알고보니까 보안 그룹의 인바운드 규칙 설정으로 http 규칙 생성을 안해서 그랬던 거였다. 미리 그걸 했으면 좋았을텐데..

 

대음 연 서버에 나의 프로젝트 넣는법

sudo vi /etc/nginx/sites-available/원하는이름.conf

이후 입력하는 방법 i 누르면 입력상태로 바뀜

i 입력하고 위와 같이 입력 그 후 esc 누르면 입력 커서 사라짐

-> :wq

하고 파일 이동

cd /etc/nginx/sites-available

 

디폴트 파일 옮기기

sudo cp -r /etc/nginx/sites-available/ /etc/nginx/sites-avail-origin

 

사용할 파일의 디폴트 파일 삭제하기

 디폴트 파일의 역할이 뭘까..?

sudo rm /etc/nginx/sites-available/default

 

nginx에는 test.conf 파일이 sites-available과 sites-enabled 두 곳에 있어야한다.

sudo ln  -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/test.conf

 

nginx가 서버를 열고 파일을 찾을 때, sites-available과 sites-enabled에서 파일을 찾기 때문에 그곳으로 파일을 옮기고, 디폴트 파일을 삭제하는 것이다. 

 

디포트 파일은 우리가 nginx를 설치하고 퍼블릭 ip로 검색을 했을때 나오는 페이지이다. 그렇게 때문에 디폴트를 지워야 우리가 원하는 파일을 연결할 수 있다.

 

enabled의 디폴트 파일 백업

sudo cp -r /etc/nginx/sites-enabled/ /etc/nginx/sites-enabled-origin

 

enabled의 디폴트 파일 삭제

sudo rm /etc/nginx/sites-enabled/default

 

설정이 제대로 되어있는지 확인

sudo nginx -t

 

noginx 재시작

sudo systemclt restart nginx

 

이렇게 한 후에 타력적 ip를 치면 

이 화면이 뜨는데 정상적인 화면이다. 디폴트 파일을 지워줬고 아무것도 없기 때문이다.

 

cd ~

git -version

깃 버전확인

깃 클론하기

git clone '자기프로젝트 레파지토리 주소'

 

 

GitHub - nodesource/distributions: NodeSource Node.js Binary Distributions

NodeSource Node.js Binary Distributions. Contribute to nodesource/distributions development by creating an account on GitHub.

github.com

여기서 Node.js LTS에서 Using ubuntu bash까지 복붙해서 실행

Node.js 설치

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash

sudo apt-get install -y nodejs 

버전 확인하기 

 

pm2 설치 (nginx에서의 nodemon

sudo npm install -g pm2

 

설치 후에 서버를 연결할 폴더까지 이동해서 npm install 하기

 

cd ~

 

ls -al

 

cd /home

 

sudo chmod 711 ubuntu/ 권한 변경

 

서버를 열 파일로 가서 pm2 start index.js

 

하면 연결 성공!

 

데이터베이스 연결하는법

aws의 RDS에서 데이터베이스를 만들고 엔드포인트를 원래 mysql 연결하는 url에 입력하면 된다.

 


정리하기

 

default파일 백업하기
sudo cp -r /etc/nginx/sites-available/ /etc/nginx/sites-available-origin
sudo cp -r /etc/nginx/sites-enabled/ /etc/nginx/sites-enabled-origin
 
 
default파일 삭제하기
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default
 
새로운 conf파일 생성
sudo vi /etc/nginx/sites-available/test.conf
 
conf파일 만들기(백엔드)
server {
          listen 80;
          server_name 아이피주소;
          location / {
                    proxy_pass http://127.0.0.1:포트;
           }
}
 

위에서 적었던건 리액트 할때 즉, 프론트엔드를 할때 이용하는 거라고 한다. 미리 준비해서 알려줬다면 좋았을거 같다.

그리고 이럴경우 

이런 에러가 뜨는데 이는 권한이 허용이 안되서 그렇다고 한다 이럴때는 시작할때 앞에 sudo를 치거나

저장을 할때 :w !sudo tee % > /dev/null 이렇게 작성하면 된다고한다.

 
 
심볼릭 파일만들기
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/test.conf
 
설정확인
sudo nginx -t
ok가 떠야함!!
 
nginx 재시작
sudo systemctl restart nginx
 
500에러시 권한 변경
cd ~
cd /home
sudo chmod 711 ubuntu/

 

오늘은 너무 돌아가는 거 같았다 분명 우리가 따라가지 못하는 점도 있지만 미리 백엔드 전용으로 test.conf 파일을 만드는 법을 알려주셨으면 오늘 하루종일 nginx로 서버 배포를 하는 과정만 진행하지는 않았을 것이라 생각한다. 정리해주신 부분을 처음에 알려주고, 사용되는 리눅스 용어는 어떤 기능을 하는지 vi는 정확히 어떤 것이며, 심볼릭 링크는 무엇인지 nginx를 실행하기 위한 흐름이 어떤지를 한 번  더 정리해주셨다면 정말 좋았을 것 같다.

 

 

 

 

 

 

 

 

아니!!! aws 결제 수단 등록이 계속 안되서 그냥 네이버 클라우드 플랫폼 사용하기로 했다

빠르게 회원가입 한 후에 결제 수단을 등록한 후에 바로 이용할 수 있다.

그후 콘솔로 들어간 후 클래식으로 바꾸고 서비스를 눌러서 서버로 들어간다.

서버생성을 누르고 서버를 만든다 

그리고 공인 ip를 만들어준다

이후 서버를 이용하기 위해 putty를 다운받는다

그리고 푸티를 열어서 연 서버를 입력한다. IP주소는 공인 ip를 만든 후에 공인 ip를 Host Name에 적어준 후 Saved Sessions에 원하는 서버 이름을 적고 save를 한 후에 open한다.

이렇게 하면 서버에 접속을 할 수 있다. 브라우즈를 해서 다운받은 키를 가져오고 session으로 돌아가 저장을 하면 된다.

 

저장이 됐는지 확인하기 위해서 자신의 서버 이름을 로드 한 후 브라우즈한 키가 유지되는지 확인하면 된다. 그 후 open을 한다.

 

여기서 주의할 점은 인증키를 puttyzen에서 ppk 파일로 바꿔줘야 사용할 수 있다.

 

바꿔준 후에 open을 누르고 ubuntu를 누르면 비밀번호를 입력하라고 나온다 이를 확인하기 위해선 네이버 클라우드에서 아래와 같이 서버 관리 및 설정 변경에서 관리자 비밀 번호 확인을 통해 비밀번호를 가져와야한다. 

확인하는 법은 아래와 같이 관리자 비밀번호 확인을 누르고 인증키로 받은 pem 파일을 넣어준후 확인할 수 있다.

 

여기까지 진행하고 open 된  터미널 창에서 login as에 root를 치고 비밀번호를 입력하면 되는데 비밀번호는 입력해도 표시가 안되기 때문에 당황하지 말고 잘 입력하면 된다.

위와 같이 열리면 로그인 성공!

 

그리고 aws는 계속 100원 결제가 안되서 사용이 불가했던 것이었다. 이 내용을 정리할때 aws도 같이 해볼 것이다.

 


인바운드 규칙

포트 번호를 설정하는 것

aws 기준 > 네트워크 보안 > 보안 그룹

여기서 나오는 서버를 클릭하면 정보를 확인할 수 있고, 세부 사항에서 인바운드 규칙 > 규칙 편집 으로 들어가서 정보를 수정할 수 있다. 

보안 그룹 id를 복사한 후 인스턴스로 넘어가서 보안 그룹 이름과 id도 세부사항에서 확인할 수 있다. 

규칙 추가를 하여 정보를 수정한 후에 검색을 하여 추가하고자하는 id에 추가 할 수 있다.

 

네이버는 

여기서 설정해줄 수 있다.

아파치를 사용하기 위한 과정이다(?)

 

FileZilla

Download FileZilla Client 클릭

기본인 FileZilla 다운로드 후 setup 실행하여 설치한다.

원래 아마존으로 하면

사용자는 ubuntu 키 파일을 불러오면 되는데 네이버 클라우드 플랫폼은 비밀번호 묻기로 하고 사용자는 root로 지정해야한다 포트번호는 putty로 연결할때 사용한 포트를 쓰면 된다.

 

 


웹서버

클라이언트의 http 요청을 받아 다양한 처리를 함

정적 파일을 전달하는 서버를 웹 서버라고 함

아파치 

http 표준을준수하도록구축된오픈소스형식의서버
오래사용되어만큼거의모든OS에서실행이가능하고, 다양한모듈을
갖고있다.

 

아파치 설치

아까 로그인한 터미널에서 

# sudo apt-get update
# sudo apt-get install apache2

를 입력하여 설치한다.

 

그 후에 파일질라에서 var/www/html로 들어가서 index.js를 확인할 수 있고 도메인 주소를 검색하면 

로 시작하는 화면을 확인할 수 있다 

 

그 후에 sudo  chmod 777 /var/www/html // 전송이 가능하도록 해주는 코드

를 터미널에 입력하고 원하는 html파일을 html 폴더로 드래그하여 넣어주면 

도메인/html파일이름 을 입력하면 해당 페이지가 보이는 것을 확인할 수 있다.

 


아파치2 웹서버 루트 디렉토리 변경하는 법

두가지 파일을 수정해서 지정되어 있는 파일을 변경해야한다.

기본값은 /var/www/html로 지정되어 있다 이를 바꾸기 위해

 

sudo nano /etc/apache2/apache2.conf

를 입력하고

연두색 표시되어 있는 줄의 디렉토리 옆을 /root로 바꾸고,

 

sudo nano /etc/apache2/sites-available/000-default.conf

를 입력하고 

DocumentRoot 옆을 /root로 바꾸어 준 후에

 

sudo service apache2 restart

 

를 실행하면 재설정된다. 


IP :

인터넷 상에서 데이터를 주고받기 위한 통신 규약

스마트폰 컴퓨터에 따라 운영체제가 다르고 프로그램마다 구현 언어가 다르기에 이를 네트워크 상에서 통신할 수 있도록 프로토콜이 필요하기 때문에 생김

 

IP 주소 

IP 통신에 필요한 고유 주소

데이터를 주고 받기 위해 사용되는 주소

IPv4 : 32비트 8비트씩 끊어 0-255 사이의 10진수 숫자로 나타냄 / .으로 숫자 구분

IPv6 :  IPv4가 고갈되어 새로 나온 방식 128비트이며, 16진수 숫자 8개로 표기한다 / :으로 숫자 구분

 

끝!! 다음에 정리할 때 좀 더 자세히 정리해야겠다.. 하핳

 

리눅스 명령어 간단 정리

명령어 의미
ls 해당 경로의 폴더에 있는 파일 확인
cd 폴더 이동
vi 파일을 열어서 보여줌
a or i 입력 상태
esc -> : -> wq(수정한 상태를 저장하고 종료) or q!(강제 종료)

 

 

 

 

soket과 http의 차이

soket은 emit을 통해 한번 열어주면 닫지 않을때까지 계속 열려 있다. 그렇기 때문에 실시간 채팅이 가능하다

http는 한번 통신 한 후에 닫기 때문에 실시간으로 채팅을 하기에는 어려움이 있다.

 

씨퀄라이즈와 포스트맨을 통해 만든 테이블에 값 넣고 가져오기

메인 폴더(230810_JOIN)의 index.js

const express = require('express');
const app = express();
const PORT = 8080;
const db = require('./models');

app.set('view engine', 'ejs');
app.use('/views', express.static('./views'));
app.use('/static', express.static('./static'));
app.use(express.json());
app.use(express.urlencoded({extended : true}));


const router = require('./routes/student');
app.use('/', router);

db.sequelize.sync({force: true}).then(() => {//true 값을 넣어야 다시 index.js를 실행할 때 삭제하고 다시만들어준다.
    app.listen(PORT, () => {
        console.log(`http://localhost:${PORT}`);
    });
});

어제와 동일하다

routes 역할의 student.js

const express = require('express');
const router = express.Router();
const controller = require('../controller/Cstudent');

router.get('/', controller.index);
router.post('/student', controller.post_student);
router.post('/class', controller.post_class);
router.get('/student', controller.get_student);

module.exports = router;

controller의 Cstudent.js

const {Student, StudentProfile, Classes} = require('../models')
// 구조 분해 할당으로 값을 넣어줘서 model.~로 안하게함 사실 import를 쓰면 됨

exports.index = (req, res) => {
    res.render('index');
}

//학생 생성
exports.post_student = async (req, res) =>{
   
    try{
        const {userid, password, email, name, major, enroll} = req.body;
        const user = await Student.create({
            userid,
            password,
            email,
            StudentProfile: {
                name,
                major,
                enroll,
            },
        }, {include : StudentProfile}
        );
        console.log(user);
        res.send(user);
    } catch (error) {
        console.log(error);
    }
   

}
exports.post_class = async (req, res) =>{
    try{
        const {name, room, code, teacher_name, StudentId} = req.body
        const classes = await Classes.create({
            name,
            room,
            code,
            teacher_name,
            StudentId,
        })
    } catch(error){

    }
}

exports.get_student = async (req, res) => {
    try {
        const student = await Student.findAll({
            attributes: ['userid', 'email'],
            include: [{model: StudentProfile, attributes: ['major', 'enroll']}]
        });
        res.send(student);
    } catch (error) {
        console.log(err);
    }
}

model 폴더의 Classes.js

const { DataTypes } = require("sequelize");
const { sequelize } = require(".");


const classModel =(sequelize) => {
    const Classes = sequelize.define(
        'Classes',
        {
            id: {
                type: DataTypes.INTEGER,
                allowNull: false,
                primaryKey: true,
                autoIncrement: true,
            },
            name: {
                type: DataTypes.STRING(31),
                allowNull: false,
            },
            room:{
                type: DataTypes.STRING(7),
            },
            code:{
                type: DataTypes.STRING(7),
                allowNull: false,
            },
            teacher_name:{
                type: DataTypes.STRING(15),
            },


        });
        return Classes;
};

module.exports = classModel;

model 폴더의 Student.js

const { DataTypes } = require("sequelize")

const studentModel = (sequelize) => {
    const Stdent = sequelize.define(
        'Student',
        {
            id:{
                type: DataTypes.INTEGER,
                allowNull: false,
                primaryKey: true,
                autoIncrement: true,
            },
            userid: {
                type: DataTypes.STRING(31),
                allowNull: false,
            },
            email : {
                type: DataTypes.STRING(31),

            },
            password : {
                type: DataTypes.STRING(255),
                allowNull: false,
            }
        });
        return Stdent;
}

module.exports = studentModel;

model 폴더의 StudentProfile.js

const { DataTypes } = require("sequelize")

const studentProfileModel = (sequelize) => {
    const StudentProfile = sequelize.define('StudentProfile',{
        id:{
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true,
        },
        name: {
            type: DataTypes.STRING(15),
            allowNull: false,
        },
        major:{
            type: DataTypes.STRING(31),
            allowNull: false,
        },
        enroll: {
            type: DataTypes.INTEGER,
            allowNull: false,
        }
    });
    return StudentProfile
};
module.exports = studentProfileModel;

model 폴더의 index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
const  sequelize = new Sequelize(config.database, config.username, config.password, config);


//모델

db.Student = require('./Students')(sequelize);
db.Classes = require('./Classes')(sequelize);
db.StudentProfile = require('./Studentprofile')(sequelize);

//관계형성
//1:1 학생과 프로필
db.Student.hasOne(db.StudentProfile);
db.StudentProfile.belongsTo(db.Student);

//1:다 학생과 강의
db.Student.hasMany(db.Classes);//, {foreignKey: 'student_id'}외래키 지정을 안하면 알아서 지정을해준다.
db.Classes.belongsTo(db.Student);//, {foreignKey: 'student_id'}

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

이렇게 하여서 node index.js를 실행시키면 지정한 데이터베이스에 테이블이 들어간다 그 후에 포스트맨에서 워크 스패이스를 만든 후 값들을 넣을 수 있다.

 

※ 여기서 model폴더의 index.js에서 외래키를 지정하던 문자을 빼서 씨퀄라이즈에서 자동으로 외래키를 만들어주는데 만들어줄때는 define으로 정의된 이름에 id를 CamelCase 형식으로 붙여서 외래키 이름을 만들어준다. 위의 코드를 실행한후 Classes와 StudentProfile에 생성된 외래키를 보면 다음과 같다

※ autoincrement는 id를 자동으로 갱신시켜준다.

 

포스트맨으로 값 넣고 가져오기

라우트에 있는 주소를 입력한 후 req.body로 받기 때문에 Body > raw > JSON으로 바꾸고 객체로 데이터를 보낼 수 있다. 이렇게 한 다음 send를 누르면 컨트롤러 폴더 Cstudent.js의 학생 생성 함수(?)가 돌아가고 값을 넣은 후에 다시 돌려보내준다.

classes 테이블에도 같은 방식으로 값을 넣는다.

그리고 원하는 데이터를 가져오기 위해 get을 이용한다

위와 같이 get으로 send를 해주면 라우터가 아래의 코드와 연결 시켜준 후에 원하는 이름을 입력하여 원하는 데이터를 받을 수 있다.

exports.get_student = async (req, res) => {
    try {
        const student = await Student.findAll({
            attributes: ['userid', 'email'],
            include: [{model: StudentProfile, attributes: ['major', 'enroll']}]
        });
        res.send(student);
    } catch (error) {
        console.log(err);
    }
}

 


Cookie와 Session

Cookie

웹브라우저에 저장되고 키와 값이 들어있는 작은 데이터 파일

[동작 방식]

1. 클라이언트가 페이지를 요청

2. 서버에서 쿠키를 생성

3.http 헤더에 쿠키를 포함하여 응답

4. 브라우저가 종료되어도 쿠키 만효 기간이 지나지 않았다면 클라이언트에서 보관하고 있다.

5. 같은 요청을 할 경우 http 헤더에 쿠키를 함께 보냄

6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을때, 쿠키를 업데이트하고 http 헤더에 포함시켜 응답

위와 같은 방법으로 확인 가능

 

Cookie 사용하기

npm i cookie-parser 명령어로 설치한 후에

 

const cookieParser = require("cookie-parser");

app.use(cookieParser());

 

res.cookie('쿠키 이름', '쿠키값', '옵션 객체')

 

위의 방법으로 사용 가능하다.

 

npm init -y

npm i express ejs cookie-parser

 

import express from 'express';
import cookieParser from 'cookie-parser';
const app = express();
const PORT = 8080;

app.set('view engine', 'ejs');
app.use('/views', express.static('./views'));
app.use('/static', express.static('./static'));
app.use(express.json());
app.use(express.urlencoded({extended : true}));

//쿠키 파서
// app.use(cookieParser());

//암호화
app.use(cookieParser('12341234'));

//쿠키 옵션
const cookieConfig = {
    // httpOnly : 웹 서버를 통해서만 쿠키에 접근할 수 있다.
    // 자바스크립트에서 document.cookie를 이용해서 쿠키에 접속하는 것을 차단한다.
    // maxAge : 쿠키 수명 밀리초
    // expires : 만료 날짜를 GMT시간 설정
    // path: 해당 디렉토리와 하위 디렉토리에서만 경로가 활성화 되고 웹 브라우저는 해당하는 쿠키만 웹 서버에 전송된다
    // 쿠키가 전송될 url을 특정할 수 있다 (기본값 : '/')
    // domain : 쿠키가 전송될 도메인을 특정 가능 ( 기본 값 : 현재 도메인)
    // secure : 웹 브라우저과 웹 서버가 https로 통신하는 경우만 서버에 전송
    // signed : 쿠키의 암호화 결정 ( req.signedCookies 객체에 들어있다.)
    httpOnly: true,
    maxAge: 60 * 1000,//1분
    signed : true
}

app.get('/', (req, res) => {
    res.render("index");
});
 
app.listen(PORT, () => {
    console.log(`http://localhost:${PORT}`);
});

ejs ▽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="/setCookie">쿠키 설정</a>
    <a href="/checkCookie">쿠키 확인</a>
    <a href="/delCookie">쿠키 제거</a>
</body>
</html>
app.get('/setCookie', (req, res) => {
    //쿠키이름 쿠키 값 옵션
    res.cookie('myCookie', 'myVal', cookieConfig);
    res.send('set cookie');
})

app.get('/checkCookie', (req, res) => {
    //쿠키이름 쿠키 값 옵션
    // res.cookie('myCookie', 'myVal', cookieConfig);
    res.send(req.signedCookies);
})

app.get('/delCookie', (req, res) => {
    res.clearCookie('myCookie', 'myVal', cookieConfig);
    res.send('clear cookie')
})

위 코드를 맨위의 코드 get과 listen 사이에 넣어서 사용

 

Session

웹 서버에 저장되는 쿠키 웹 브라우저를 통해 접속한 시점부터 연결을 끝내는 시점까지의 시간 동안 일련의 요구를 하나의 상태로 보고 그 상태를 유지 시킨다.

[동작 방식]

1. 클라이언트가 서버에 접속 시 세션 id를 발급 받음

2. 클라이언트는 세션 id에 대해 쿠키를 사용해서 저장하고 가지고 있다

3. 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 id를 서버에 전달해서 사용합니다.

4. 서버는 세션 id를 전달받아서 별다른 작업 없이 세션 id로 세션에 있는 클라이언트 정보를 가져옴

5. 클라이언트 정보를 가지고 서버 요청을 처리여 클라이언트에게 응답

 

npm i express-session를 입력하여 설치 후 사용

 

 

+ Recent posts