만두의 부트캠프 🤔
  • 노마드 코더 <세션vs토큰vs쿠키 기초개념>
    2024년 01월 05일 09시 56분 49초에 업로드 된 글입니다.
    작성자: 만두33

    노마드 코더 <세션vs토큰vs쿠키 기초개념>

     

    https://www.youtube.com/watch?v=tosLBcAX1vk

     


    ✔️ 쿠키vs토큰

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

    사이트에 방문하면 브라우저는 서버에 요청을 보냄

    서버는 응답한다. 응답에는 데이터랑 내가 찾던 페이지 정보가 있고, 거기는 브라우저에 저장하고자하는 쿠키가 있어!

    내가 브라우저에 쿠키를 저장하고 해당 웹사이트 에 방문할때마다 브라우저는 해당 쿠키도 요청과 함께 보낸다.

    쿠키는 도메인에 따라 제한됨(유튜브 쿠키는 유튜브에만) 그리고 서버가 정한 기간동안 유효하낟.

    쿠키는 인중말고 다른 정보도 저장 가능

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

    그다음에 내가 웹사이트 방문할때 쿠키는 요청과 함께 브라우저-->서버로 보내지고 서버는 쿠키가 저장한 언어설정의 페이지를 제공한다.

     


    ✔️ 세션 vs 토큰

    웹사이트를 이용할때 쓰는 프로토콜 http는 Stateless 

    Stateless는 서버로 가는 모든 요청이 이전 리퀘스트와 달리 독립적이다.

    요청끼리의 연결고리는 없다. 메모리가 없다!는뜻

    요청이 끝나면 서버는 나를 잊어버림!

    요청할때마다 내가 누군지 알려줘야함

     

    이 방법중 하나가 세션이다.

    1. 내이름+비번을 --->서버에 보냄

    2. 비번이 맞으면 서버는 세션DB라는 곳에 '내이름'이라는 유저 생성

    3. 이 세션에는 별도의 ID가 있음. 이 별도의 세션ID는 쿠키를 통해 브라우저로 돌아오고 저장됨

     

    따라서 같은 웹사이트의 다른 페이지로 이동하면?

    브라우저는 세션ID를 갖고있는 쿠키를 서버에게 보낸다.

    쿠키는 자동으로 보내지고,

    서버는 들어오는 쿠키를 보고  세션ID와 함께 오는 쿠키를  확인한다.

    아직도 서버는 우리가 누군지 몰라!!

    세션ID가있는 쿠키를 지닌 요청이 있다는것만 알 뿐이다.

    헤당 세션ID를 가지고 세션DB를 확인할것이고

    거기서 해당 ID는 유저명 "내이름"이라는것을 알게되고

    이제 서버는 내가 누군지 알고 "안녕 만두!"한다.

    해당 요청이 끝나고 다른 페이지로 이동하면 

    이 모든 프로세스가 반복된다.

     

    중요한건 중요한 유저 정보는 모두 서버에 있다!

    유저가 갖고있는것? 그냥 세션ID

    쿠키는 이 세션ID를 전달하는 매개체이다!


    ✔️ 토큰

    세션을 이용해서 ios, 안드로이드 앱을 만들 수 있지만, 쿠키는 네이티브 앱에는 없다!

    이런경우 토큰을 사용한다!

    서버에 토큰을 보내는것이다.

    토큰은 그냥 이상하게 생긴 string

    해당 토큰을 서버에 보내고

    서버는 세션 DB에서 해당 토큰과 일치하는 유저를 찾는다!

     

    세션에 대해서 기억해야 할 것은? 현재 로그인한 유저들의 모든 세션ID를 DB에 저장해야한다는것

    즉 요청(request)이 들어올 때 마다

    서버는 쿠키를 받아서 세션ID를 보고

    세션ID와 일치하는 유저를 찾고 다음 작업을 수행한다.

    요청이 있을때마다 DB를 찾아야한다!

    즉 유저가 늘어나서 DB리소스가 더 필요해진다!

     

    이때 등장하는 JWT 

    JWT는 토큰 형식이다.

    JWT로 유저 인증을 한다면

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

    토큰은 그냥 이상하게 생긴 텍스트임, 서버에서 받아서 요청할때마다 보내야한다.


    ✔️ JWT와 세션의 차이점

    로그인 예시를 통해 JWT와 세션의 차이점을 알아보자!

    *JWT 로그인 방식

    1. 유저 만두가 로그인을 하려면 유저명, 비번을 서버에 보낸다.

    2. 유저명, 비번이 맞으면 서버는 DB에 뭔가를 생성하지 않는다.
    대신 서버는 유저의 ID(예시)를 가져가서 사인 알고리즘을 이요해서 '사인'한다.
    그리고 해당 사인된 정보를 string형태로 돌려보낸다.

    3. JWT는 보통 세션ID보다 훨씬길다.
    alsdjfqpoweolajslkdncnm 뭐 이렇게 생겼다
    왜냐? 쿠키는 공간 제약이 있지만 JWT는 없음 엄청 길어도된다.

    4. 이제 서버에 요청을 보내려면 세션 ID와 비슷하게 해당 사인된 정보 혹은 토큰을 서버에 보내야한다.

    5. 서버는 토큰을 받으면 해당 사인이 유효한지 체크하고 (토큰을 조작했는지 체크하는 과정이다.)

    6. 토큰이 유효하면? 서버는 우리를 유저로 인정함

    로그인 차이점
    JWT 세션
    JWT에서 서버는 유저를 인증하는데 필요한 정보를 토큰에 저장한다. 그리고 해당 토큰을 우리(브라우저)에게 준다.

    브라우저가 페이지를 요청하면 서버는 해당 토큰이 유효한지만 검증하면 된다! (DB거칠 필요가 없음!)
    세션에서는 로그인 할때 그냥 서버--->브라우저 세션 ID만 주면 된다.
    세션에 대한 모든 정보는 세션 DB에 저장 되어있다.

    브라우저--->서버에게 페이지를 요청하면 
    서버는 세션ID를 DB에서 찾으면 된다. 

     

    JWT는 암호화 되지 않았음. 암호화 되었으면 아무도 읽지도 못하고 이해도 못함

    JWT는 누구나 열어서 볼수있음, 비밀정보를 JWT에 넣으면 안됨!!

     

    핵심은, 토큰을 사인하고, 이를 통해서 유효한지 검증한다는것이다!


    ✔️ 세션 vs JWT 장점 단점

     

    세션을 사용하면? 서버는 로그인 된 유저의 모든 정보들을 저장함

    해당 정보를 이용해서 새로운 기능을 추가할 수 있다.

     

    예를들면 특정 유저를 쫒아내고 싶을때? 세션을 삭제하면된다.

    혹은 인스타그램처럼 로그인된 모든 디바이스를 보여주는데,

    원하지 않는 디바이스에서 로그아웃 할 수 있음

    혹은 넷플릭스처럼 계정 공유 숫자를 제한 할 수 있다.

    현재 로그인을 몇명이 했고, 시청하는지 알 수 있다.

     

    이 모든 기능이 가능한것은?

    서버가 누가 로그인했는지 저장하고 세션DB가 있기 때문이다.

    이렇게 유지하려면 DB를 사고 유지해야한다.

    그리고 유저가 늘어가면 DB가 커진다.

    보통 이를 위한 DB로는 주로 Redis를 사용한다.

    해당 목적을 수행하지 위한 빠르고 저렴한 DB이다.

     

    JWT를 사용하면, 생성된 토큰을 추적하지 않는다.

    서버가 아는것은, 토큰의 유효함 여부이다.

    JWT에서는 DB를 따로 살 필요는 없다.

    하지만 위에서 말한 그 기능(자동로그아웃)은 할 수 없다.

    해당 토큰이 만료되기 전까지는 유효하니까.

     

    JWT는 데이터를 사인하고 유저에게 보내고,

    해당 데이터를 돌려받을때, 유효성을 검증할 수 있다! DB 없이!!! 👍

     

    시간제한 있는 QR코드 =JWT가 들어간 QR코드이다.

    JWT는 사용사례가 많다.

    그중 하나가 세션이나 DB 없이 유저를 인증하는것.

    JWT인증의 제약만 잘 알아두면 된다.

     

    JWT는 쉽고 5분이면됨

    서비스가 더 커지고 유저 계정을 잘 관리하고 싶다면 세션으로 갈아탈 예정


    쿠키? 그냥 옮기는 시스템, 매개체

    토큰? 서버가 기억하는 이상하게 생긴 텍스트, ID 카드처럼 서버에게 보여줘야 하는것이다.

    JWT? 정보를 갖고있는 토큰, DB없이 검증할 수 있다.

    유저 인증을 위해서 JWT나 세션을 사용할 수 있다!

    

     

     

    댓글