쿠키 vs 세션 vs JWT 토큰 방식의 개념에 대해 알아보자
SNS 서비스의 회원가입과 로그인 기능을 구현하는 중 Auth 에 대해서 알게되었다 .
서버에서 사용자를 어떻게 기억하고 인증할까?
서버가 쿠키에 사용자 정보를 저장해두고 이를 세션으로 유지한다는 식의 대략적인 정보는 이전에 들어본 적이 있었지만
제대로 알아본 적은 없는 것 같기에 이번기회에 확실히 정리해 두고 넘어가보려 한다
쿠키 🍪 vs 토큰 ?
쿠키를 이용해서 서버는 사용자에 관한 것을 기억하기 위해 브라우저에 데이터를 담아둘 수 있다.
사이트에 방문하게 되면 브라우저는 서버에 요청을 보내게 되고 서버는 이 요청에 대한 응답으로 클라이언트가 요청한 모든 데이터와 페이지 정보를 담아 주게된다. (흔히 아는 요청 - 응답 방식 ) 그리고 이때 반환하게 되는 응답에 쿠키가 존재할 수 있다.
브라우저에 쿠키를 저장하게 되면 해당 웹 사이트에 방문할 때마다 브라우저는 해당 쿠키도 요청과 함께 보냄
서버는 쿠키가 기억해둔 설정을 바탕으로 응답을 제공하게 된다.
세션과 토큰을 이해하기 전에
웹 사이트를 이용할 때 쓰는 프로토콜 HTTP 는 stateless 이다 .
상태가 없다는건 무슨 말일까?
Stateless 라 함은 서버로 가는 모든 요청이 이전의 요청들과 독립적으로 다루어진다는 뜻이다.
즉 요청들끼리는 서로 연관성이 없고 요청이 끝나면 서버는 누가 어떤 요청을 했는지 전혀 모른다.
그래서 즉 요청 할 때마다 우리가 누구인지 알려줘야 하는데 이 방법에 바로 세션과 토큰이 나눠져 있는 것이다.
세션이란?
로그인을 예로 들어 설명해보면 로그인 요청을 할 때 유저는 유저명(id) 과 비밀 번호를 서버에 보내게 된다.
비밀번호가 맞다면 서버는 세션 DB 에 해당 유저를 생성하고 이 DB에서 해당 유저를 위한 세션 ID 를
응답할 때 쿠키에 넣어 반환해주고 브라우저에 넘어왔을 때 저장되는 것이다!
따라서 동일한 웹사이트의 다른 페이지로 이동하게 되면 브라우저는 요청 할 때마다 세션 ID 가 포함된
쿠키를 서버에 보낼 것이고 이 세션 ID를 DB를 통해 조회하여 해당 세션 ID 를 가진 유저가 어떤 유저인지 알 수 있게 된다.
세션에서 가장 중요하고 기억해야할 것은 모든 정보는 서버에 있고, 유저가 가지고 있는 것은 세션 ID 뿐이라는 것
그리고 현재 로그인한 유저들의 모든 세션 ID 를 DB에 저장해야 한다는 점이다.
즉 요청이 들어올 때 마다 서버는 쿠키를 받아서 세션 ID를 보고 DB를 조회하여 세션 ID와 일치하는 유저를 찾아야함
=> 서비스 이용자 수가 많아지게 되면 DB 리소스가 더 많이 필요해져서 서버에 부담이 많이 걸리게 됨
그럼 토큰은 대체 뭔데?
그렇다면 토큰은 어떨 때 사용하는 것이고 세션이랑은 무슨 차이가 있는 것일까?
앞서 말했다시피 서비스 이용자 수가 많아지게 되면 서버는 요청이 들어올 때마다 세션 DB 를 조회해야하기 때문에 부하가 많이 걸린다는 단점이 존재했다.
이를 해결하기 위해 나온 것이 바로 JWT 토큰 방식이라 할 수 있다.
JWT 로 인증을 처리하게 되면 세션 DB 를 갖출 필요가 없고, 서버는 유저 인증한다고 많은 일을 하지 않아도 된다.
로그인 예시를 통해 JWT 와 세션의 차이점을 알아보자
세션에서는 유저가 유저명과 비밀번호를 요청을 통해 넘겨주면 세션 DB 에 세션 ID를 생성했던 것과 달리
토큰 방식에서는 서버는 DB에 뭔가를 생성하지 않는다.
대신 서버는 유저가 요청을 통해 담아온 정보들을 특정 알고리즘을 이용하여 사인하고
이 사된 정보를 string 형태로 응답을 통해 넘겨준다.
그리고 요청 때마다 서버에 이 JWT 토큰을 함께 넘겨주고, 서버는 이 토큰이 유효한지 체크한 뒤 서버는 우리는 유저로 인증한다.
이것이 토큰과 세션의 가장 큰 차이점이다.
즉 페이지를 요청하면 서버는 복잡한 조회과정 없이 해당 토큰이 유효한지만 검증하면 된다.
JWT 무조건 좋을까?
JWT 를 사용해야할 때 유의해야 할 점은 바로 JWT 에서 사용자 정보를 사인하여 토큰을 만든다고 했는데 이 sign 이라는 것은
암호화를 뜻하는게 아니다.
JWT 토큰은 누구나 꺼내서 볼 수 있다.
따라서 비밀 정보를 JWT 안에 둬서는 절대 안된다는 것이다.
세션 vs 토큰의 장단점 비교 🎟️
[ 세션 ]
장점
- 로그인 된 유저의 모든 정보를 DB에 저장하기 때문에 해당 정보를 이용해서 새로운 기능들을 쉽게 추가할 수 있다
- ex) 특정 유저를 쫓아내고 싶을 때 그냥 해당 세션을 삭제해버리기만 하면 됨
- 연결된 디바이스 중 원하는 기기를 삭제, 계정 공유 숫자를 제한
단점
- 이용자 수가 늘어 날 수록 DB 리소스에 대한 부담이 커지고 수많은 요청에 마다 DB를 조회하는데에 부하가 걸림
[ 토큰 ]
장점
- DB 없이도 유저인증이 가능하기에 서버 부담이 덜하다
- 유저 규모가 작을 땐 토큰 방식이 나음
단점
- 서비스 규모가 커지고 유저 정보를 좀 더 잘 관리하고 싶다면 세션 방식이 나을 수도 있음
- 생성된 토큰을 추적하지 않고 DB가 필요없기 때문에 강제 로그아웃 등의 기능을 구현할 수는 없음
[ 정리 ]
쿠키 = 그냥 요청, 응답 시에 기억하기 위해 옮기는 시스템 매개체
JWT 토큰 = 사용자 정보를 가지고 있는 이상하게 생긴 긴 문자열 . DB없이 사용자 인증이 가능
세션 = 매 요청마다 특정 ID 를 쿠키에 담아서 DB 조회후 사용자 인증