내배캠 96일차

·2023년 2월 17일
0

내일배움캠프

목록 보기
105/142
post-thumbnail

Unknown database Error

직접 mysql에서 스키마를 만들어주면 해결!!

면접질문

콜백함수

  • 다른 함수의 인자로써 이용되는 함수
  • 어떤 이벤트에 의해 호출되어지는 함수

예시) setTimeout()

익명함수

자바스크립트 익명 함수(anonymous function)는 함수명 대신 변수명에 함수 코드를 저장하는 구현 방식이다. 익명 함수의 소스 코드는 변수값이므로 끝에 세미콜론 ; 을 대입한다. 익명 함수는 호출 시 변수명을 함수명처럼 사용하면 된다.

  const 변수명 = function( 매개변수 )
  {
    실행문;
  };

익명함수는 일반함수와 달리 호이스팅(함수 선언 보다 함수 호출이 윗 줄에 위치해도 실행되는 기능)이 적용되지 않는다.

화살표 함수

화살표 함수(Arrow function)는 function 키워드 대신 화살표(=>)를 사용하여 보다 간략한 방법으로 선언할 수 있습니다.

화살표 함수는 익명 함수로만 사용할 수 있다. 따라서 화살표 함수를 호출하기 위해서는 함수 표현식을 사용한다. 또는 콜백 함수로 사용할 수 있다. 이 경우 일반적인 함수 표현식보다 표현이 간결하다.

화살표 함수는 몇 가지 제한점이 있고 모든 상황에 사용할 수는 없습니다.
1. this나 super에 대한 바인딩이 없고, methods 로 사용될 수 없습니다.
2. new.target키워드가 없습니다.
3. 일반적으로 스코프를 지정할 때 사용하는 call, apply, bind methods를 이용할 수 없습니다.
4. 생성자(Constructor)로 사용할 수 없습니다.
5. yield를 화살표 함수 내부에서 사용할 수 없습니다.

쿠키 & 세션

쿠키란?

쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일입니다.
사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있습니다.
쿠키는 클라이언트의 상태 정보를 로컬에 저장했다가 참조합니다.

세션이란?

세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리합니다.
서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지합니다.

쿠키와 세션의 차이

쿠키와 세션은 비슷한 역할을 하며, 동작원리도 비슷합니다. 그 이유는 세션도 결국 쿠키를 사용하기 때문입니다.
가장 큰 차이점은 사용자의 정보가 저장되는 위치입니다. 때문에 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용합니다.
보안 면에서 세션이 더 우수하며, 요청 속도는 쿠키가 세션보다 더 빠릅니다. 그 이유는 세션은 서버의 처리가 필요하기 때문입니다.

쿠키를 사용하는 이유

세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있기 때문에 쿠키가 유리한 경우가 있습니다.

JWT

쿠키의 문제점

쿠키가 노출되었을 때, ID나 PW 같은 중요 정보들이 쉽게 노출된다.
웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능하다.
쿠키의 사이즈는 4KB로 제한되어 많은 양의 데이터를 담을 수 없다.

세션의 문제점

세션 ID, 쿠키 등이 탈취된다면 세션 저장소를 전부 지워 해결 가능하지만, 탈취당하지 않은 정상적인 사용자도 모두 재인증을 해야함

STATELESS를 위배한다.

STATELESS라면 서버는 클라이언트의 상태를 저장하지 않아야 하지만, 세션 저장소라는 곳에서 클라이언트의 상태를 저장하게 되므로 STATEFUL하게된다.

더 나아가자면, 서버를 스케일 아웃 했을 때 1번 서버에 로그인한 사용자가 다른 2번 서버로 요청을 보내게 된다면 2번 서버에는 로그인 상태가 남아있지 않기 때문에 다시 로그인해야 하는 상황이 발생

=> 1), 2)를 해결하기 위해 jwt가 등장함

JWT 등장 배경

쿠키와 세션 사용 시 문제점이었던 STATEFUL 특성을 JWT 사용 시 STATELESS하게 가져갈 수 있음
즉, 서버는 클라이언트의 상태를 가질 필요가 없다.

인증에 필요한 정보가 토큰에 들어있어서 별도의 저장소가 필요 없다.

다양한 언어에서 지원한다.

HTTP HEADER에 넣어서 쉽게 전달 가능하다.

JWT 단점

거의 모든 요청에 토큰이 포함되므로 트래픽 크기에 영향을 미칠 수있다.
토큰에 정보가 많아져 토큰의 크기가 커지면 네트워크에 부하를 줄 수 있다.
페이로드는 암호화된 게 아니라 BASE64로 인코딩 된 것이므로 중간에 토큰을 탈취하면 페이로드의 데이터를 모두 볼 수 있다.
따라서, 페이로드에는 중요 정보를 담아서는 안된다.

JWT 토큰발급, 인증과정

  1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의한다.
    Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.
  3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있음)
    API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보낸다.
  4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
    인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다.
  5. 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서
  6. 서버로부터 새로운 엑세스 토큰을 발급 받는다.
profile
개발자 꿈나무

0개의 댓글