웹 공부를 하다보면 세션, 토큰, 쿠키라는 단어를 정말 많이 듣는다.
많이 듣는것 치고는 각각이 어떤 특징을 가지는지 또 어떤 차이점이 있는지 정확히 알지 못해서
이번에는 세션, 토큰, 쿠키 각각의 특징이 무엇인지 또 장단점은 무엇인지 알아보고자 한다.
: 쿠키는 나의 브라우저에 데이터를 넣을 수 있도록 도와주는 매개체이다.
쿠키를 이용해 서버는 나의 브라우저에 다양한 데이터를 넣을 수 있다.
브라우저에 데이터를 넣는 순서는 다음과 같다.
이러한 과정과 함께 쿠키를 통해 데이터를 전송받게 된다.
쿠키는 서버가 설정해 놓은 기간에 따라 유효기간이 존재하며, 인증 뿐만 아니라 여러 정보를 저장할 수 있다. (언어 설정 등)
그 다음으로 세션과 토큰에 대해서 이해해보자.
세션과 토큰에 대해서 이해하려면 먼저 Stateless에 대해서 알아야 한다.
Stateless는 프로토콜로 서버로 가는 모든 요청이 이전 리퀘스트와 독립적으로 다뤄진다는 의미이다.
요청끼리 연결이 없고 메모리가 없기 때문에 요청이 끝나면 서버는 우리가 누군지 잊어버린다.
그래서 요청할 때마다 우리가 누군지 알려줘야 한다.
세션과 토큰은 이러한 Stateless 프로토콜 방식을 사용한다.
: 세션은 쿠키를 기반으로 하여 사용자 정보 파일을 서버 측에서 관리하는 것이다.
세션을 통한 인증 과정은 다음과 같다.
쿠키는 그저 세션ID를 전달하기 위한 하나의 매개체이다.
세션에 대해서 기억해야할 점은 현재 로그인한 유저들의 모든 세션 ID를 DB에 저장해야 한다는 것이다.
즉, 요청이 들어올 때마다 서버는 쿠키를 받아 세션 ID와 일치하는 유저를 찾아야하고 그제서야 다음 요청이 수행 가능하다. 유저가 늘어남에 따라 DB리소스가 더 필요하다.
세션을 이용해 iOS, Android 앱을 만들 수 있지만, 쿠키는 사용할 수 없다.
쿠키는 브라우저에만 있기 때문이다. 그래서 이 경우 토큰 사용하게 된다.
: JWT는 토큰 형식이며 세션 DB가 필요하지 않고 서버는 유저 인증을 위해 많은 일을 하지 않는다.
JWT를 통한 인증 방식 과정은 다음과 같다.
세션에서는 세션 ID만 서버에 전달하면 된다. 세션에 대한 모든 정보는 세션 DB에 저장되어 있다.
JWT는 유저를 인증하는데 필요한 정보를 토큰에 저장하여 사용자에게 전달하고 서버에서는 해당 토큰이 유효한지 검사한다.
세션을 사용하면 로그인된 유저의 모든 정보를 저장하기때문에 해당 정보를 이용해 새로운 기능을 추가 시킬 수 있다. 그러나 이 정보를 모두 저장하려면 DB를 사고 유지해야 한다.
JWT를 사용하면 생성된 토큰을 추적하지 않는다. 서버가 아는것은 토큰이 유효한지가 전부이다. DB를 사거나 할 필요 없다. 그러나 새로운 기능 등을 추가 할 수 없다. 토큰이 만료되기까지는 모든 사용자가 유효하기 때문이다.