본문 바로가기
TIL

20210304 TIL

by reo.l 2021. 3. 4.

배운 것들

  • https
  • hashing
  • cookie
  • session
  • csrf

 

더 알아볼 것

  • cookie options
  • axios vs fetch
  • withcredentials
  • cookie vs session 테이블 외우기

 

 

 cookie와 session 스프린트를 진행했다. axios대신에 fetch를 사용하여 구현하다가 꽤 애를 먹었다. axios는 fetch와 다르게 다음과 같은 특징을 갖는다.

error handling 관련해서
fetch는 catch에 걸리더라고 이후의 then 문을 실행하는 반면에
axios의 경우엔 then 문을 실행하지 않고 console 창에 해당 에러로그를 보여준다.
또한 JSON 데이터 자동 변환이 가능한데
fetch처럼 json으로 변환 후 출력하지 않고 바로 data 프로퍼티에 접근해서 출력할 수 있다.

이러한 특징 때문에 해결하는데 시간을 많이 쏟았다. 

해결 후 cookieParser라는 미들웨어를 사용하여 쿠키를 전달했다.

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

module.exports = {
  post: async (req, res) => {
    let userInfo = await Users.findOne({
      where: { userId: req.body.userId, password: req.body.password },
    });
    if(!userInfo||!userInfo.id){
      res.status(400).json({data:null,message:'not authorized'})
    }
    else{
      res.cookie('id',userInfo.id,{domain:'localhost',path:'/', secure:true, httpOnly:true, sameSite:'none'})
      res.json({data:null, message:'ok'})
    }
  },
};

 

클라이언트에게 쿠키를 전달하고 로그아웃 시에 cookie를 삭제하기 위해 cookie에 전달한 아이디 값을 확인한고 삭제해준다.

module.exports = {
  post: (req, res) => {
    if (!req.cookies.id)
      res.status(400).json({ data: null, message: 'not authorized' });
    else {
      res.clearCookie('id');
      res.json({ data: null, message: 'ok' });
    }
  },
};

 

쿠키는 자바스크립트로 접근이 가능하기에 보완에 취약할 수 있다. 이를 보완하기 위해 id 값만 전달하여 관리하는 방식이 session이다. session은 session id값을 섹션 객체에 저장하여 클라이언트에게 전달하는 방식이다. 

module.exports = {
  post: async (req, res) => {
    const userInfo = await Users.findOne({
      where: {
        userId: req.body.userId,
        password: req.body.password
      },
    });

    if (!userInfo) {
      res.status(400).json({
        message: 'not authorized'
      })
    }
    else {
      req.session.userId = userInfo.id
      res.json({
        data: userInfo,
        message: 'ok'
      })
    }
  }
}

 

cookie 미들웨어에서 옵션 값으로 들어가는 값에는 이러한 것들이 있다.

  1. domain - 서버와 요청의 도메인이 일치하는 경우 쿠키 전송
  2. path - 서버의 요청의 세부 경로가 일치하는 경우 쿠키 전송
  3. maxage/expires - 쿠키의 유효기간 설정
  4. httpOnly - 스크립트의 쿠키 접근 가능 여부 설정
  5. secure - HTTPS에서만 쿠키 전송 여부 설정
  6. sameSite - CORS 요청의 경우, 옵션 및 메서드에 따라 쿠키 전송 여부 설정

여기서 sameSite:lax get에서만 쿠키를 전달하고 None 은 secure에서 Strict는 쿠키 전송이 불가하다. lax를 쓰는 것이 제일 깔끔하다.

이번 주에 인증에 대해서 공부하면서 중요성을 많이 느꼈다. 외부로부터의 공격을 막는 방법이기도 하며 사용자에게 편의성을 제공한다. 생소한 부분이라 조금 어려웠지만 복습하면서 사용법을 익히면 괜찮아질 것이라고 생각한다.

 

 

 

'TIL' 카테고리의 다른 글

20210308 TIL  (0) 2021.03.08
20210305 TIL  (0) 2021.03.07
20210303 TIL  (0) 2021.03.03
20210302 TIL  (0) 2021.03.02
20210301 TIL  (0) 2021.03.01

댓글