[인증] 쿠키와 세션 (passport로 테스트)

jiseong·2021년 12월 10일
0

T I Learned

목록 보기
152/291

HTTP 프로토콜의 Stateless한 특징으로 인해 정보가 유지되지 않아 로그인한 상태에서 페이지가 이동되면 또 다시 로그인을 해야하는 상황이 벌어지는데 이러한 인증부분을 해결하기 위해 쿠키와 세션을 사용한다고 할 수 있다.

그리고 passport는 Node사용 시 인증부분을 좀 더 편리하게 사용할 수 있도록 도와주는 라이브러리이다.

쿠키

  • 클라이언트(브라우저)에 key-value 형식을 가진 정보가 저장되는 작은 파일
    (보안에 취약하다는 단점이 존재하기 때문에 중요한 정보들은 저장하지 않는다.)
    (사용 예시로는 사이트 접속 시 뜨는 팝업의 '오늘은 더 이상 이 창을 보지 않음' 체크 유/무)

세션

  • 서버측에 저장되는 정보
    (서버측에서 관리하기 때문에 쿠키보다는 보안에서 더 낫다.)

express-sessionpassport를 사용하였을 때,

// 사용자 로그인시 로컬전략으로 로그인
passport.authenticate('local');

// 해당부분이 로그인시 회원 정보를 이용하여
// 세션 생성(저장소에 세션 저장도 포함)
// 1, 2에 해당
passport.serializeUser((user, callback) => {
  callback(null, user.id);
});

// 클라이언트에서 요청시마다 저장된 세션을 가져와 조회 후
// req.user에 정보가 담기게 되고 이를 이용해서 권한 허용/비허용
// 3에 해당
passport.deserializeUser((id, callback) => {
  User.findById(id, function(err, user) {
    callback(err, user);
  });
});
const config = {
  usernameField: 'email',// 'email' 필드 사용하도록 설정
  passwordField: 'password',// 'password' 필드 사용하도록 설정
};

passport.use(new LocalStrategy(config, async (email, password, done) => {
  try {
    const user = await User.findOne({ email });
   
    if (!user) {
      throw new Error('회원을 찾을 수 없습니다.');
    }

    if (user.password !== hashPassword(password)) {
      throw new Error('비밀번호가 일치하지 않습니다.');
    }

    done (null, {
      shortId: user.shortId,
      email: user.email,
      name: user.name,
    });
  } catch (err) {
    done(err, null);
  }
}));
  1. 클라이언트가 로그인 시 서버측에서 암호화된 세션의 해쉬값을 생성 ( 서버의 저장소에 해당 값을 저장 )
  1. response의 Set-Cookie를 사용하여 connect.sid에 생성한 해쉬값을 저장 (Set-Cookie: connect.sid=hashedValue)
  1. 클라이언트의 데이터 요청시마다 딸려오는 헤더의 쿠키를 사용하여 인증관련을 해결

이때 서버측에 저장되는 세션은 특별한 설정이 없다면 서버 메모리에 저장되어 서버가 꺼지면 사라지기 때문에 따로 세션DB를 두어 서버가 꺼져도 사라지지 않게 할 수 있는 방법도 존재한다. (e.g. connect-mongo 라이브러리)

위의 동작방식과 동일한 사진을 구했다.

하지만 세션 방식으로 인증을 하게되면 나중에 로드 밸런싱을 사용하여 서버 확장이 될 경우 세션의 관리가 어려워지고 세션을 위한 서버를 따로 둔다해도 과부화 현상에 대한 위험성이 증가하기 때문에 JWT 방식도 생겨나게 되었다.


(HTML5에서 추가된 로컬 스토리지 및 세션 스토리지도 알아보기)

Reference

0개의 댓글