[나만의무기] Cookie와 Session, JWT

Baedonguri·2022년 7월 31일
0

HTTP

뒤에 나올 쿠키와 세션, 토큰을 이해하기 위해서는 HTTP의 특성을 알아야한다.

HTTP(Hypertext Transfer Protocol)는 W3 상에서 정보를 주고 받을 수 있는 프로토콜로 이를 활용하면 HTML 텍스트뿐만 아니라 모든 것을 전송할 수 있는데,
HTTP는 다음과 같은 특징이 존재한다.

무상태성(Stateless)
서버가 클라이언트의 이전 상태를 보존하지 않는다는 의미.

비연결성(Connectionless)
클라이언트가 서버에 요청하고 응답을 받으면 바로 TCP/IP 연결을 끊어 연결을 유지하지 않는 것.

위와 같은 특징 덕분에 클라이언트가 서버와 연결 상태를 유지하지 않기 때문에 서버 자원을 절약할 수 있지만 연결 해제 후에 상태 정보가 저장되지 않는다는 단점이 있다.

만약 클라이언트가 웹사이트를 접속해 로그인을 한다고 하면, 이와 같은 HTTP의 특성 때문에 매번 로그인을 해야 한다는 문제가 발생하게 될 것이다.

이런 HTTP의 비 연결성과 무상태성을 보완하기 위해 서버가 클라이언트를 식별하기 위해 쿠키와 세션을 사용한다.

(반대로 연결지향 프로토콜(Connection Oriented)에는 TCP가 있다.)


쿠키는 사이트를 방문하고 이용할 때, 이용자의 브라우저에 저장되는 내용들이다.
서버는 쿠키를 이용해서 브라우저에 데이터를 넣어 이용자에 대한 정보를 기록할 수 있다.

  1. 웹 사이트에 방문하면, 브라우저는 서버에 요청(request)을 보낸다.
  2. 서버는 요청에 대해 응답(response)을 반환하는데, 이 응답에는 내가 찾는 페이지 정보를 비롯하여
    다양한 정보가 담겨있으며 여기에는 쿠키가 담겨 있을 수 있다.
  3. 브라우저는 받은 쿠키를 저장소에 넣어둔다.
  4. 이후, 서버에 다른 요청을 보낼 때 이 쿠키도 함께 보낸다.
  • 쿠키는 도메인에 따라 제한됨 (ex. youtube에서 발급한 쿠키는 youtube에만..)
  • 쿠키는 유효기간이 존재. 서버가 정한 기간에 따라 유효하다.
  • 쿠키는 인증 뿐만 아니라 여러 정보를 저장할 수 있다. (ex. 페이지 언어 설정)

Sessions

위에서 언급했던 HTTP의 특성 때문에 요청이 끝나면 서버는 요청을 한 녀석이 누구인지 잊어버리기 때문에 요청할 때마다 내가 누구인지 알려주어야 한다.
이를 위한 방법 중 하나가 바로 세션이다.

웹 사이트에서 로그인하는 과정을 통해 세션에 대해 알아보자.

  1. 아이디와 비밀번호를 입력하고, 로그인버튼을 눌러 서버에 로그인 요청을 한다.
  2. 서버는 이 정보들이 DB에 존재하는 값과 일치할 경우 세션 DB에 유저를 생성한다.
  3. 해당 세션에는 별도의 ID가 있어 해당 세션 ID는 쿠키를 통해 브라우저로 돌아오고 저장된다.
  4. 이용자가 같은 웹 사이트의 다른 페이지로 이동할 때 브라우저는 세션 ID를 가지고 있는 쿠키를 서버로 보낸다.
  5. 서버는 해당 세션 ID를 가지고 세션 DB를 확인하여 쿠키를 보낸 녀석이 누구인지 확인할 수 있는 것이다.

즉, 세션 방식은 현재 로그인한 유저들의 모든 세션 ID를 DB에 저장해야 한다는 것.
요청이 들어올 때마다 서버는 쿠키를 받아서, 세션 ID를 보고 세션 ID와 일치하는 유저를 찾아야 다음 작업을 수행할 수 있다.
이는 유저가 늘어감에 따라 DB 리소스가 더 필요한 것을 의미하기도 한다.

여기서 짚고 넘어가야 할 점은 유저가 갖고 있는 것은 세션 ID 뿐이고, 쿠키는 이 세션 ID를 전달하기 위한 매개체일 뿐이라는 점이다.

장점

  • 쿠키가 담긴 HTTP 요청이 도중에 노출되어도 쿠키 자체 (세션 ID)는 유의미한 값을 가지고 있지 않아 비교적 안전하다. (중요한 정보는 서버 세션에 위치)
  • 고유의 ID 값을 발급 받기 때문에 바로 어떤 회원인지 확인 할 수 있어 서버 자원에 접근하기 용이함.

단점

  • 서버에 추가적인 저장 공간이 필요하다. 회원이 많아질 경우 부하가 높아질 수 있음

JWT (Json Web Token)

JWT (JSON Web Token) 는 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다.
위의 세션/쿠키 방식과 유사하게 사용자는 Access Token (JWT Token) 을 HTTP 헤더에 실어 서버에 전송한다. 토큰은 임의로 생성된 비밀번호 같이 동작하는데, 제한된 수명을 가지고 새로운 토큰은 한번 만료되면 새로 생성되어야 하는 특징을 가지고 있다.(Refresh Token)

장점

  • JWT를 이용하면 따로 서버의 메모리에 저장 공간을 확보할 필요가 없음.(세션 DB와 같은)
  • 서버가 토큰을 한번 클라이언트에게 보내주면 클라이언트는 토큰을 보관하고 있다가 요청을 보낼때마다 헤더에 토큰을 실어보내면 된다.
  • 쿠키를 사용할 수 없는(쿠키는 only web) 모바일 어플리케이션에는 JWT를 사용한 인증방식이 최적이다.

단점

  • JWT는 HTTP를 통해서 전송하기 때문에 페이로드의 크기가 클수록 데이터 전송에 있어서 비용이 커진다.
  • JWT는 유효기간을 따로 정하지 않는 이상 소멸되지 않기 때문에 장기간 방치시 해킹의 위험이 커진다.
  • Payload는 따로 암호화되지 않기 때문에 디코딩하면 누구나 정보를 확인할 수 있다.
    따라서 유저의 중요한 정보들은 Payload에 넣을 수 없다.
profile
Software Engineer

0개의 댓글