글 작성자: 망고좋아
반응형

📖 오늘 배운 내용 - 2021.12.09

  • OAuth
  • JWT
  • passport
  • Session
  • Cookie

 

📝 OAuth

  • 접근 권한 위임(delegation)을 위한 공개 표준
  • 간단히 말하면 인증서 같은 거다.
  • 유저가 쉽게 사용할 수 있다. (원 클릭 로그인) ⇒ 비밀번호를 기억할 필요가 없다.
  • 유저 허용 여부에 따라 이메일, 프로필 사진, 닉네임 등의 기본 정보를 얻을 수 있다.

 

📝 JWT와 쿠키

📕 Session의 단점

  • 서버에 따라 검증 가능 여부가 달라진다. → 세션을 위한 서버를 따로 분리하지 않는 이상은 분산된 서버를 사용하기 애매함
  • 특정 서버의 과부하 현상에 대한 위험 증가
  • 세션 테이블을 만들어 서버에 저장함으로 서버 공간 및 자원 낭비

 

📕 JWT의 장점

  • SECRET key가 공유된 서버라면 서버단에서 검증 가능
  • 분산된 데이터베이스를 사용해도 문제없다. -> 데이터베이스 유지, 보수, 확장 편리
  • 디비의 자원 절약, 효율적
  • 즉, 서버의 부하를 줄일 수 있다.

 

📕 JWT의 단점

  • 외부 공격자가 접근하기 쉬운 위치, 노출 가능한 정보
  • 노출 가능성으로 저장할 수 있는 정보가 제한적이다.
  • 암호화가 풀릴 가능성 존재

 

해결 방법

  • 토근 만료 시간을 짧게 설정(3~5분)
  • 리프레시 토큰을 이용한다. -> 이중 토근을 사용하여 토큰 암호화 강화

 

📝 Session-Cookie 방식

  • 서버는 컴퓨터 한 대가 아니다. 실제로 서버스를 돌리면 컴퓨터를 1대 이상 돌리게 된다.
  • 그러나 사용자의 요청은 한 군대로 들어오지만 컴퓨터는 여러 대라서 이 요청을 분배해주는 것을 로드 밸런싱(load balancinge라고 한다. 어느 곳으로 분배해주는지는 우리도 모른다! 무튼 스마트하게 넘겨준다.
  • 쿠키-세션일 때는 로드 밸런싱이 사용자의 id, pwd를 1번 컴퓨터로 넘겨주면 1번 컴퓨터는 그것을 검증하고 1번 컴퓨터에 세션을 저장하고 사용자에게 쿠키를 돌려준다.
  • 그 후 사용자가 로그인한 후 마이페이지를 보기 원해서 요청을 날렸을 때 이번엔 로드 밸런싱이 2번 컴퓨터로 준다면 어떻게 될까?
  • 2번 컴퓨터에는 사용자 쿠키에 해당하는 세션이 없다. (해당 쿠키에 맞는 세션을 1번 컴퓨터가 가지고 있기 때문에) 그래서 2번 컴퓨터가 사용자에게 "너 로그인 해!" 이렇게 말할 수 있다/
  • 그래서 이러한 문제를 해결하는 방법으로 뒷단에 redis를 놓는다. 모든 컴퓨터들은 자신이 세션을 가지고 있는 것이 아니라 redis에다 저장해 놓는다.
  • 그래서 로드 밸런싱이 어떠한 컴퓨터로 요청을 던져도 컴퓨터는 redis에서 해당 쿠키에 맞는 세션을 확인하고 응답을 반환해준다.

 

📝 JWT

  • 하지만 JWT를 사용하면 redis를 사용하지 않아도 된다.
  • jwt는 토근이라서 위조가 상당히 어렵지만 탈취당하면 큰일 난다.
  • jwt는 여권, 신분증이라고 생각하면 된다. 그냥 내 자체이다. 그래서 만료기간을 정해놓는다.
    • 짧으면 5분에서 30분, 길면 1주일
  • 1번 컴퓨터에서 로그인 요청을 받으면 id, pwd를 검증받고 jwt를 사용자에게 준다.
  • 그 뒤 사용자가 요청을 날리면 그 토큰이 위조되었는지만 확인하면 된다.

 

📝 passport 객체의 메소드

  • serializeUser() : 메소드를 호출하면서 등록한 콜백 함수는 사용자 인증이 성공적으로 진행되었을 때 호출됨 ⇒ 로그인됐을 때 딱 한 번만 실행(login)
  • deserializeUser() : 사용자 인증 이후 사용자 요청이 들어올 때마다 호출 ⇒ 로그인 한 뒤 요청이 들어올 때마다 실행된다. (req)
  • passport.authenticate() : username과 password를 찾아보도록 설정

 

📝 Passport

  • OAuth를 쉽게 도와주는 모듈이다.
 

Passport.js

Simple, unobtrusive authentication for Node.js

www.passportjs.org

 

💡 오늘 깨달은 것

  • 보통 프론트, 백엔드 따로 작업을 진행하는 작업형태를 가지고 있는데, 팀원들끼리 기능별로 나눠서 프론트와 백 모두 짜는 것도 괜찮은 방법이다.
    • 초반엔 프론트가 빠르고 백엔드가 느릴 수 있겠지만 후반으로 갈수록 프론트는 반응형 작업에서 시간이 오래 걸린다.

 

📌 참고

반응형