쿠키 , 세션 , 토큰 , 캐쉬 , JWT .... 하여튼 요런 종류의 것들은 옛날 옛적부터 나를 아주 헷갈리가 만들었던 녀석들이다. 😑
개발 공부를 하게 되면서 하나하나 알게 되고 있지만 역시나 정리가 필요하다.
이번 글에서는 쿠키와 세션에 대해서 정리하고 나아가 JWT와 유저 인증에 대해서 이야기 하겠다.
둘다 web 통신간 유지하려하는 정보(예: 로그인 유저의 정보)를 저장하기위해 사용된다.
사용자가 web 브라우저를 통해 웹서버에 접속한 시점부터 web 브라우저를 종료하는 시점까지의 시간동안 사용자의 중요한 정보를 서버 측에서 가지고 유지하고 있는 기술
세션과 달리 user 측 웹 브라우저에 user에 대한 간단한 정보를 담고 있는 곳으로 유저를 인증하기 위한 토큰 같은 것을 가지고 있다.
쿠키는 브라우저에만 있고 스마트 폰에는 없다.
특정 web page에서 사용자가 login을 하면 그 사용자가 web page 어디를 돌아다니든 login이 유지될 수 있도록 하는 기술이 쿠키와 세션이라는 거~~
브라우저에서 내가 서버로 언어 변경 을 요청하면 그 요청에는 해당 요청을 보낸 " 나 "를 식별할 수 있게하는 쿠키가 같이 보내진다.
서버는 이 쿠키를 보고 요청을 보낸 " 나 " 라는 유저의 브라우저 언어를 변경해준다. 그리고 " 나 " 가 언어를 변경했다는 정보를 세션에 저장한다. ---> " 나 " 가 브라우저를 새로고침하거나 다른 tab으로 다른 page에 갔다와도 쿠키와 세션에 저장된 정보를 보고 언어 변경 상태를 유지해준다.
세션은 브라우져가 종료될 때까지 남아 있지만, 쿠키는 따로 만기일이 존재하고 특정 web page에만 귀속된다.
쿠키와 세션을 통한 유저 인증은 오래된 유저 인증 방식이다. 주로 사용자의 중요한 정보는 세션에 그리고 유저 인증을 위한 --> 서버에 유저의 정보가 있는 위치를 담은 세션 ID는 쿠키에 저장되어 브라우저로 보내 유저가 가지고 있는 방식의 인증이다.
브라우저가 아닌 네이티브 앱에서는 토큰이 이 역할을 한다.
중요한 것은 위 방식에서 쓰이는 유저의 모든 세션 ID는 서버 DB에 저장해야한다는 것이다.
이는 사용자의 요청이 들어올 때마다 서버는 DB를 뒤져서 사용자 정보를 찾아야한다는 것이고, 사용자가 많아지만 자연스레 DB 리소스가 더 필요하게 된다. --> 서버에 큰 부하가 걸리게 된다.
그래서 요즘에는 JWT 방식을 쓰기도 한다.
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
그리고 JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다
JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다.
따라서 사용자가 JWT 를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.
DB에 유저 인증을 위해 무언가 생성하지 않아도 된다는 말
이와같이 사용자는 서버와 이 JWT로만 인증을 거치기 때문에 DB를 크게 생각하지 않아도 된다.
하지만 JWT는 암호화 되어 있지 않기 때문에 누구든 열어서 정보를 확인할 수 있다는 단점이 있다. --> 비밀번호같은 중요한 정보는 JWT에 보내면 안된다는 뜻
그렇다면 JWT가 더 나은 유저 인증 방식일까?
사용자 인증을 위한 세션 ID를 따로 서버에 저장하면 특정 유저 삭제, 같은 계정 공유인원 제한, 특정 기기에서만 강제 로그아웃 등 다양한 기능을 추가할 수 있다. --> 유저 정보가 DB에 저장되어 있기 때문
BUT
DB를 쓰는 만큼 DB를 잘 관리해야하고 사용자가 늘어나면 DB를 그만큼 많이 사야한다.
앞의 세션이 가진 단점은 DB를 사용할 필요가 없는 JWT는 가질 수 없다. 빠르게 유저 인증을 할 수 있기 때문에 코로나 QR체크인과 같이 많은 사람이 사용해야하는 인증서비스에는 딱! 이다.
BUT
유저에 대한 정보가 없기 때문에 세션 & 쿠기가 할 수 있는 기능들은 JWT는 하지 못한다.
이번 글에서는 쿠키 세션 JWT에 대해서 작성하며 더불어 관련된 유저 인증이라는 것에 대해서 알아보았다.
쿠키 & 세션이든 JWT든 자세히 파고 들면 좀 더 할 이야기가 많이 있지만 오늘은 여기서 줄이도록 하겠다.
참고
https://inpa.tistory.com/entry/WEB-📚-JWTjson-web-token-란-💯-정리 [👨💻 Dev Scroll:티스토리]
노마드코더- 세션 vs 토큰 vs 쿠키? 기초개념 잡아드림. 10분 순삭! https://www.youtube.com/watch?v=tosLBcAX1vk&t=313s