본문 바로가기
IT기초상식

세션 vs 토큰 vs 쿠키

by 티코딩 2023. 4. 18.

머리로는 대충 알지만 설명하라고 하면 입꾹닫 되는 것들에관한 니꼴라스 성님의 영상이 있길래 못참고 정리하는김에 포스팅해본다.

쿠키

쿠키란? 쿠키를 이용해 서버는 사용자의 브라우저에 데이터를 넣을 수 있다. 사이트에 방문하면, 브라우저는 서버에 요청을 보낸다. 서버는 이에 응답하는데, 거기엔 브라우저가 저장하고자하는 쿠키가 있을 수 있다. 브라우저에 쿠키를 저장하고, 해당 웹사이트에 방문할 때 마다, 브라우저는 해당 쿠키도 요청과 함께 보낸다. 쿠키는 도메인에 따라 제한이 된다. 그리고 쿠키는 유효기간이 있다. 서버가 정한기간에 따라 상이하다. 쿠키는 인증뿐 아니라, 여러가지 정보를 저장할 수 있다. 웹사이트 언어설정을 바꾸면, 서버는 쿠키를 주고, 선택한 언어를 저장한다. 해당 웹사이트에 다시 방문할때, 쿠키가 요청과 함께 서버로 보내지고, 서버는 쿠키가 기억해둔 언어설정의 페이지를 제공한다. 

세션, 토큰

이걸 얘기하려면 http를 먼저 얘기해야한다. 웹사이트를 이용할때 사용하는  stateless 프로토콜이다. Stateless라 하면, 서버로 가는 모든 요청이 이전 리퀘스트와 독립적으로 다뤄진다는 얘기다. 요청끼리 연결이 없고, 메모리가 없다. 그래서 요청할 때마다 우리가 누군지 알려줘야 한다. 이를 하는 방법중에 하나가 세션이다. 해당 세션엔 별도의 ID 가 존재한다. 해당 세션ID는 쿠키를 통해 브라우저로 돌아오고 정렬된다. 세션ID를 가지고 세션DB를 보고, 거기서 해당ID가 유저가 맞는지를 알게 되고, 서버는 우리가 누군지 알고, 다음동작을 수행할 수 있다. 

중요한 유저 정보는 모두 서버에 있다. 유저가가지고 있는 것은 세션ID뿐이다. 쿠키는 그저 세션ID를 전달하기 위한 매개체이다. 세션을 이용해 iOS, Android 앱을 만들 수 있지만, 쿠키는 브라우저에만 존재하기 때문에 쿠키는 사용할 수 없다. 이 경우, '토큰'을 사용한다.

토큰은 이상하게 생긴 String이라고한다. 해당 토큰을 서버에 보내고, 서버는 세션DB에서 해당토큰과 일치하는 유저를 찾는다. 

세션에서 기억해야할건 로그인한 유저들의 모든 세션ID를 DB에 저장하고, 요청이 들어올 때 마다, 서버는 쿠키를 받아서 세션ID를 보고, 일치하는 유저를 찾고 작업을 수행한다. 고로, 요청이 있을때마다, DB에서 찾아야한다는것이다. 그렇게 유저가 늘어남에 따라, DB리소스가 더 필요하다는 것이다. 여기서 JWT가 등장하는데, JWT란 토큰형식으로, 유저 인증을 처리하면 세션DB를 가질 필요가 없고, 서버는 유저를 인증한다고 많은 프로세스를 거칠 필요가 없다. 토큰은 이상하게 생긴 String이고, 서버에서 받아서, 요청할 때마다 보내는것이다. 

 

JWT의 인증 절차를 보자면, 유저가 로그인하려면, 유저명, 비밀번호를 서버에 보내고, 맞다면 서버는 DB에 뭔가 생성하지 않는대신, 유저의 ID를 가져다가 사인 알고리즘을 이용해 사인된정보(토큰)를 string 형태로 보낸다. 보통 세션ID보다 훨씬 길다. 쿠키는 공간의 제약이 있지만 JWT는 제약이 없기 때문이다. 이제 유저가 서버에 요청을 보낼땐, 사인된정보(토큰)을 서버에 보내야한다. 서버는 토큰이 유효한지 검사하고, 유효하다면, 사용자로 인식한다.

정리하자면, 세션에선 그냥 세션ID만 주면된다. 서버에는 세션DB에 저장되어있다. 페이지 요청하면 세션DB에서 세션ID를 찾는다.

JWT에서는 서버는 유저를 인증하는데 필요한 정보를 토큰에 저장한다. 그리고 해당 토큰을 우리에게 준다. 이제 요청에 토큰을 함께 보내면 서버는 토큰이 유효한지만 검증한다.(DB를 거칠 필요없이) JWT는 암호화 되어있지 않다. 고로 비밀정보를 JWT에 둬서는 안된다.

 

세션vsJWT 장단점

세션의 장점 - 서버는 로그인 된 유저의 정보를 모두 저장함. 해당 정보를 이용하면 새로운 기능들을 추가할 수 있음. 특정 유저를 삭제하는 기능, 로그인된 디바이스에서 선택한 디바이스 삭제하기, 등등.

단점 - DB를 사고, 유지해야함. 유저가 늘어나면날수록 DB도 커져야함. 이를 위한 DB는redis를 사용함.

JWT의 장점 - 생성된 토큰을 추적하지 않음. DB를 따로 살 필요가 없음. 데이터를 사인하고, 유저에게 보내고, 데이터를 돌려받을 때, 유효성검증을 할 수 없다.

단점 - 새로운 기능을 추가할순 없음. 서비스가 더 커지고 유저 정보를 더 잘 관리하고싶다면 세션을 쓰는게 좋다.

 

**나도 프로젝트에서 JWT를 사용했다.

signup

이렇게 계정을 만들고,

로그인완료

로그인하면, accessToken을 body에 담아서 준다.

JWT 토큰이용

JWT 토큰을 입력하고 requestbody에 적절하게 데이터를 담아서 주면 잘 작동된다.

 

이렇게 정리하고나니 설명할 수 있을것같다!

'IT기초상식' 카테고리의 다른 글

IT 기초상식 remind_4  (0) 2022.03.02
IT 기초상식 remind_3  (0) 2022.02.22
IT기초상식 remind_2  (0) 2022.02.15
IT기초 상식 remind_1  (0) 2022.02.14