세션&토크, 쿠키, JWT 개념

쿠키

쿠키를 이용해서 서버는 사용자에 대해 기억하기위해 사용자의 브라우저에 데이터를 넣을 수 있다.

쿠키 사용방식

  1. 사이트 방문시 브라우저는 서버에 요청을 보낸다.
  2. 서버는 이에 응답하는데, 응답에는 사용자가 찾던 페이지 정보가 있고 해당 정보에는 쿠키가 있을 수 있다.
  3. 사용자가 브라우저에 쿠키를 저장한 후, 해당 웹사이트를 방문할 때마다 브라우저는 해당 쿠키도 요청과 함께 보내게 된다.

쿠키 특징

💡 쿠키는 도메인에 따라 제한된다.

→ 예를 들어, 네이버가 준 쿠키는 네이버에서만 보내지게 된다.

💡 쿠키에는 유효기간이 있다.

→ 서버가 정한 시간에 따라 유효하다.

💡 쿠키는 인증 뿐만 아니라, 여러가지 정보를 저장할 수 있다.

→ 예를 들어, 웹사이트 언어설정을 바꾸면, 서버는 쿠키를 주고, 사용자가 선택한 언어를 저장한다.

→ 따라서 다음에 해당 웹사이트를 방문하면, 쿠키는 요청과 함께 서버로 보내지므로 서버는 쿠키가 기억해둔 언어설정의 페이지를 제공한다.

세션과 토큰

세션과 토큰이 왜 필요한지 이해하려면 웹사이트를 이용할 때 쓰는 프로토콜인 HTTP에 대해 알아야 한다.

HTTP

HTTP는 stateless하다.

여기서 stateless라 함은, 서버로 가는 모든 요청이 이전 요청과 독립적으로 다뤄진다는 뜻이다.

즉, 요청끼리 연결이 없다. (메모리가 없다.)

요청이 끝나면 서버는 사용자가 누군지 잊어버린다는 의미이다. 따라서 사용자는 요청할 때마다 자신이 누군지 알려줘야한다.

이를 알려주는 방법 중 하나가 바로 세션(session)이다.

세션 작동 방식

  1. 사용자가 아이디와 비밀번호를 입력하면 서버에 보내진다.
  2. 비밀번호가 맞다면 서버는 세션 DB에 해당 사용자를 생성한다.
  3. 해당 세션에는 별도의 ID가 있다.
    1. 해당 세션 ID는 쿠키를 통해 브라우저로 돌아오고 저장된다.
  4. 따라서 같은 웹사이트의 다른 페이지로 이동하면, 브라우저는 세션 ID를 갖고 있는 쿠키를 서버에게 보낸다.
  5. 서버는 세션 ID와 함께 들어오는 쿠키를 확인한다.
  6. 아직까지도 서버는 해당 사용자가 누군지 모른다. 단지, 세션 ID가 있는 쿠키를 지닌 요청이 있다는 것만 알 뿐이다.
  7. 해당 세션 ID를 가지고 세션 DB를 확인할 것이고, 거기서 해당 아이디는 그 사용자에 해당한다는 것을 알게 된다.
  8. 해당 요청이 끝나고 다른 페이지로 이동하면, 위 프로세스가 반복된다.

세션을 이용해 Android, IOS 앱을 만들 수 있지만, 브라우저에서만 존재하는 쿠키로는 그럴 수 없다. 이 경우를 위해 토큰(token)을 사용한다. 서버에 쿠키가 아닌 토큰을 보내는 것이다.

토큰

토큰은 여러 문자의 종류로 이루어진 굉장히 긴 문자열의 형태이다. 공간 제약이 있는 쿠키와는 달리 토큰은 그렇지 않다.

토큰이 서버로 보내지면, 서버는 세션 DB에서 해당 토큰과 일치하는 사용자를 찾는다.

세션은 현재 로그인한 사용자들의 모든 세션 ID를 DB에 저장해야 한다. 즉, 요청이 들어올 때마다 서버는 쿠키를 받아서 세션 ID를 보고 세션 ID와 일치하는 유저를 찾아야한다. 이에 따른 문제점은, 사용자가 늘어나면 그에 맞게 DB 리소스가 더 필요하다는 점이다.

JWT

이를 보완하기 위해 JWT가 등장한다.

JWT로 유저 인증을 처리하면

  1. 세션 DB를 가질 필요가 없고,
  2. 서버는 유저 인증한다고 많은 일을 하지 않아도 된다.

JWT 작동 방식

  1. 로그인하여 서버에 요청을 보내는 것 까지는 세션 방식과 동일하다.
  2. 유저명, 비밀번호가 일치할시 서버는 DB에 무언가를 생성하지 않는다.
  3. 서버는 유저의 아이디를 가져다가 사인 알고리즘을 이용해 사인을 한다. (토큰 유효성 검증)
  4. 그리고 사인된 정보를 string 형태로 브라우저로 보낸다.

세션과 JWT, 그리고 그 둘의 장﹒단점

💡 세션

👉🏻 장점

세션을 사용하면 서버는 로그인된 유저의 모든 정보를 저장하는데 해당 정보를 이용하면 새로운 기능들을 추가할 수 있다. 예를 들어, 특정 유저를 쫓아내고 싶을 때 그 때 그냥 세션을 삭제하면 된다. 이해하기 쉬운 예로 인스타그램에서 원하는 디바이스를 강제 로그아웃하거나 넷플릭스에서 공유 계정을 제한하거나, 현재 로그인을 몇명이 했고 시청하는지 알 수 있는데, 이는 모두 서버가 누가 로그인했는지 저장했고 세션 DB가 있기때문에 가능하다.

👉🏻 단점

세션은 DB를 사고 유지해야한다. 게다가 유저가 늘어날수록 DB가 커져야하는데, 주로 해당 DB로는 빠르고 저렴한 Redis를 사용한다.

💡 JWT

👉🏻 장점

DB없이도 데이터를 사인하고 유저에게 보내고, 해당 데이터를 돌려받을 때 유효성을 검증할 수 있다. 예를 들어, 코로나 예방 주사 접종여부를 확인하기 위한 코로나 체크인의 경우 JWT가 들어간 QR코드이다.

👉🏻 단점

세션과 달리 DB를 사용하지 않는 대신 토큰에는 사용자 정보가 없으므로 서버는 토큰의 유효성 여부는 알 수 있다. 토큰은 만료되기 전까지 유효하기 때문에 세션의 장점인 강제 로그아웃과 같은 것은 못한다.

세션 vs. JWT

JWT가 사용하기에 편리하므로 많이 사용되지만 서비스가 커지고 유저 계정을 잘 관리하고 싶다면 세션을 사용하는 것이 좋다.