[개발 상식] 쿠키, 세션, 토큰 어떤 차이일까?

이번 글은, 세션과 토큰의 차이점을 공부하며 정리한 글입니다. 세션과 토큰의 차이점을 알고, 적시에 사용할 수 있는 프로그래머가 되어 봅시다!

우선 세션과 토큰을 설명하기 앞서, 쿠키라는 개념을 짚고 넘어가 봅시다.

🍪쿠키(Cookie)?

쿠키는 브라우저에 데이터를 저장하는 것을 말합니다. 모든 브라우저는 ‘요청’ 을 보내고, ‘응답’을 받게 되는데요, 이 때 브라우저가 요청을 보낼 때 보내야할 데이터가 있다면 함께 보낼 수 있게 됩니다.

요청 시 쿠키 데이터를 함께 보낼 수 있게 되는 것이죠.

이렇게 쿠키에 저장된 값 덕분에 인증은 물론, 다양한 정보를 저장할 수 있어 페이지가 이동되거나, 브라우저를 닫고 열어도 데이터를 기억할 수 있다는 것이죠.

일반적으로 쿠키는 유효기간을 가지고 있으며, 개발 환경에 따라 달라지게 됩니다

 

쿠키는 브라우저에 데이터를 저장하기 때문에, 클라이언트 측에서 데이터를 조작할 수 있다는 특징이 있습니다. 그렇기 때문에 보안에 민감한 정보는 사용하지 않습니다.

 

앞서 쿠키에 대한 내용을 살펴보았습니다.

이제 세션과 토큰에 대해서 알아봅시다!

❓세션(Session)?

Https 프로토콜은 stateless 입니다. 즉 Https는 상태를 저장하지 않는 독립정인 요청이라는 것입니다. 아까 전 브라우저는 ‘요청’과 ‘응답’을 통해 홈페이지를 보여줄 수 있게 된다고 했습니다. 각각의 요청은 연결이 없는 독립된 상태이기 때문에, 요청이 끝나면 서버는 요청에 대한 아무런 정보를 가지고 있지 않습니다.

세션은 한 번의 요청마다 정보를 보내주는 방법 중 하나로, 서버 단에서 세션에 해당하는 DB서버를 구축하여, 세션ID를 통해 정보를 파악하는 것입니다.

세션은 위에서 말한 브라우저의 저장 방식인 쿠키속에 세션ID를 저장시킵니다. 요청 속 쿠키에 담긴 세션ID 정보를 통해 세션DB에 해당하는 정보를 서버가 알게되고, 이를 응답에 함께 보내주게 됩니다.

이미지와 같이, 세션DB 별도의 서버를 구축해야할 필요가 있고, 유저가 많아질 수록 서버를 관리하는 비용이 증가하게 됩니다.

❓토큰(Token)?

쿠키는 브라우저의 저장 방식이라고 했습니다. 만약 네이티브 환경과 같은 브라우저가 사용되지 않는 상황이라면 어떨까요? 이때 쿠키 대신 사용되는게 토큰이라고 생각하시면 됩니다. 쿠키와 비슷한 것이죠.

쿠키와 차이점이라면, 관심사를 들 수 있는데요, 쿠키는 세션ID 혹은 보안과 관련되지 안은 단순한 데이터 정보를 가지는데 반해, 토큰은 인증과 관련된 정보를 담고 있다는 것입니다.

그런데 쿠키와 마찬가지로, 클라이언트 측에서 저장된 정보라면, 민감한 정보를 가질 수 없을 텐데, 어떻게 인증과 관련된 정보를 담고 있을 수 있을까요?

❗JWT(JSON Web Token)

JWT는 토큰 기반 인증 시스템의 표준입니다. JSON 형식을 사용하여 정보를 표현하는데요, 서명(Signature)가 되어있다는 특징이 있습니다.

이 서명을 통해 ‘무결성’을 검증할 수 있어, 인증 및 권한 관리와 관련된 부분을 다룰 수 있는 정보를 저장할 수 있게 됩니다.

저는 처음에 JWT를 통해 ‘암호화’된 데이터를 서버에서 ‘복호화’한다고 생각했는데요, 이는 아니었습니다. 서명(Signature)은 암호화와는 다른 개념이며, ‘무결성’을 확인하는 과정이라고 합니다.

즉 데이터를 숨기는 ‘기밀화’가 아닌, 데이터의 ‘무결성’, 즉 토큰이 변조되지 않았음을 확인하는 것!

❗결론

이번 시간에는 쿠키, 세션, 토큰에 대해서 알아봤습니다. 이번에 로그인 인증, Auth를 직접 만들어 보면서 꼭 알아야 될 내용이라 생각이 들어 공부해봤습니다. 차이점을 정확하게 알고 있어야 효율적인 구조를 만들어 나갈 수 있겠네요!