TIL_20.07.20(월)~24(금) - Final Project2

nRecode·2020년 7월 21일
0

TodayILearned

목록 보기
68/95
post-thumbnail

20.07.20(월)

app, routes, controllers

프로젝트의 가장 상위 폴더인 app.js 폴더에 기본 환경 세팅을 진행했다. express나 cors같은 모듈들을 설치하고,

routes 폴더를 작성하였다.
routes 폴더의 각 파일들은 아래와 작은 방식으로 작성되었다.

const express = require('express');

// 라우팅 위한 express 미들웨어. 경로로 마운팅
const router = express.Router();

const {itemController} = require('../controllers');

router.post('/', itemController.additem.post);

router.patch('/:item_id', itemController.modifyitem.patch);

router.delete('/:item_id', itemController.deleteitem.delete);

module.exports = router;

이러한 라우팅을 통해서 코드의 흐름이 진행된다.

회원가입 기능 구현

유저가 email과 password를 가지고 회원가입을 할 수 있도록 구현하였다.

Users
  .findOrCreate({
    where: {
      email: email,
    },
    defalut: {
      password: password,
    },
   })
   .then(async([user,created]) => {
     if(!created){
       console.log('check')
       return res.status(409).json({ message: 'Already exists' })
     }
     const data = await user.get({ plain: true });
     console.log(data);
     res.status(200).json({ message: 'successful' });
   })
   .catch((err) => {
     res.status(404).send(err);
   })

20.07.21(화)

토큰을 이용한 로그인 구현

유저가 로그인을 하면 접근할 수 있도록 만들어야 하기 때문에, 인증을 거쳐야 하는데 이를 쿠키나 세션을 사용하지 않고 토큰을 발급하여 사용하기로 했다. 근데 위험하다... 머릿속이 뒤죽박죽 이어서 왜 토큰을 사용하게 되었는지에 대한 명확한 이유가 없어서 더 찾아보는 일이 필요할 것 같다...

// controllers/user/signin.js

const payload = { id: result.id, email: result.email }

          const token = jwt.sign(payload, "secret",
            { // 토큰 유지 기간 설정
              expiresIn: '10s'//"1 days"
            });

위와 같은 식으로 토큰을 발급하고,
클라이언트는 매 요청시 header에 토큰값을 실어준다.

authMiddleware.js 파일을 작성하는데 이는 매 요청마다 실려오는 토큰을 decode한다. 이를 미들웨어 기능을 하게 만들어서 아래와 같이 routes폴더의 내부에 작성해준다.

router.use('/signout', authMiddleware);
router.get('/signout', userController.signout.get);

passport를 접목시키고자 했지만 이를 어떻게 처리해줘야할지잘 모르겠어서 소셜로그인을 구현하면서 더 찾아보는 걸로 하였다.

패스워드 변경

토큰을 통해 알 수 있는 user정보와 입력한 password가 일치하면 변경하고자 하는 password로 update 시켜주는 코드를 작성하였다.

const { id , email } = req.decoded;
        const { password, newpassword } = req.body;

        console.log('id check: ', id);

        Users
          .update({ 
            password: newpassword},
            { 
              where: {
                email: email,
                password: password,
            }
          }).then((result) => {
              if(!result[0]){
                res.status(409).json({ message : 'Wrong Password' });
              } else{
                res.status(200).json({ message : 'Successful' });
              }
          }).catch((err) => {
              res.status(404).json({ message : err.message });
          })

로그아웃 기능도 구현하려고 했지만 일차적으로 클라이언트가 끊어줘야해서 실패...

git workflow

작업중이던 브랜치 커밋이 있는 상황이면 (작업을 다 끝내고 수정라인이 없는 경우)

git fetch upstream // upstream의 최신 커밋 정보를 스테이지에 반영
git rebase upstream/dev // 이미 작성한 커밋을 upstream 위로 쌓음

커밋이 없고 수정하던 라인에 이어 rebase를 하고 싶은 경우

git stash // 작업중이던 라인들 따로 빼놓기
git fetch upstream // upstream의 최신 커밋 정보를 스테이지에 반영
git rebase upstream/dev // 이미 작성한 커밋을 upstream 위로 쌓음
git stash pop // 작업중이던 라인 다시 복구

rebase 시 충돌이 발생하면?
브랜치 명이 커밋 주소 같이 바꿘다~~
충돌을 모두 해결하고 git add 후 git rebase --continue

내일 할 일,
왜 토큰을 사용했는가? 토큰을 사용할때 보안을 더 높일 수 있는 방법은?

팀에게 상의할 내용
커밋룰 보이게 하는게 맞는 건지....?? 흐음??
로그아웃을 클라이언트 측에서 토큰을 끊어줘야한다.
api문서 작성할 내용있는지?


20.07.22(수)

AWS 배포

배포를 진행하면서 에러가 많이 나와서 그 부분을 수정하면서 시간을 많이 차지 했다... JWT 키 부분을 test한다고 일반 문자열을 사용하여 진행했었는데 일부 파일엔 미처 수정하지 못해서 오류가 발생했고, rds라던가 보안 때문에 막아놓은 부분에서 오류가 발생해 수정하고... 진행하였다.

20.07.23(목)

password 암호화

같이 백엔드를 진행해 주시는 분이 패스워드 암호화를 models 부분에서 훅스를 사용하지 않고 set을 이용하여 진행 하셨는데, 이 부분에서 솔트를 적용하는 방법이 없어서 솔트를 추가하려고 했는데, pbkdf2를 사용하기로 했다.

function을 아래와 같이 지정했는데

function hash(pwd) { 
  crypto.randomBytes(64, (err, buf) => { // randomBytes메소드. 64바이트 길이의 salt를 생성. 
  crypto.pbkdf2(pwd, buf.toString('base64'), 48537, 64, 'sha512', (err, key) => {
    console.log(key.toString('base64'))
  }) // buf는 버퍼형식이라 toString으로 base64문자열 salt로 변경해줌.
})
}

자꾸 패스워드가 null 값으로 들어가서 동기적으로 실행하고, salt값은 환경변수로 관리하는 것으로 변경하였다.

set : function(val){ //비밀번호 암호화
 // 동기적 실행
 this.setDataValue('password', crypto.pbkdf2Sync(val, process.env.PASSWORD_SALT, 48537, 64, 'sha512').toString('base64'));
 }

20.07.24(금)

다대 다여서 만들어진 관계테이블에서 데이터를 집어 넣어야 하는데, 자꾸 null값으로만 데이터가 들어가져서 그 부분을 해결해야 해서 이 부분도 같이 백엔드를 하시는 분과 함께 작업했다. (view를 만들기 위해서는 데이터가 잘 들어가야하기에...)

알고 보니 models.index에 데이터가 관계가 설정 되어 있지 않아서 발생하는 문제였다.

관계 테이블인 items_seasons의 관계 설정을 해줘야 한다.

// 관계 설정을 해줘야지 데이터를 items_seasons 테이블에 null값이 아닌 다른 값으로 집어 넣을 수 있음!
db.Items.belongsToMany(db.Seasons, { through: 'items_seasons', foreignKey: 'ItemsId' });
db.Seasons.belongsToMany(db.Items, { through: 'items_seasons', foreignKey: 'SeasonsId' });

참고

그리고 테이블에 데이터 입력은 직접해주는 방법 밖에 사용 못하였다. 분명 다대다 관계 테이블에 직접 접근하지 않고 데이터를 넣는 방법이 있을 것 같지만 seasons 테이블은 미리 입력된 데이터에서 id를 찾아야 하기 때문에, 많은 예제와 달랐다...

 const { image, category, type, buydate, price, brand, storage } = req.body;
        let { season } = req.body // season = "['sp','sm','f','w']"

        let seasonId = []
        for(let i of season) {
            Seasons.findOne({
                where: {
                    season: i,
                },
                raw: true
            }).then(res => {
                seasonId.push(res.id);
            })
        }


        Items.create({
            image: image,
            category: category,
            type: type,
            buydate: buydate,
            price: price,
            brand: brand,
            storage: storage,
            UserId: req.decoded.id // token을 헤더에 넣어 보내면, decoded에 id가 같이 적힘.
        }).then(data => {
          
            for(let i of seasonId){
                console.log(i)
                items_seasons.create({
                    ItemsId: data.id,
                    SeasonsId: i,
                    raw: true
                })
            }
            res.status(200).send({"message": "Successful", "item_id": `${data.id}`})
        }).catch(e => res.status(404).send({"message": "Failed", "error": `${e}`}))
    })

데이터가 items 테이블에만 입력되고 관계 테이블인 items_seasons 테이블에는 입력되지 않는 경우를 방지 하기 위해 transaction을 사용하려 했지만 실패하였다...

profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글