쿠키, 세션 그리고 토큰

호찌·2024년 4월 25일
post-thumbnail

💡 쿠키, 세션, 토큰의 필요성

많은 사용자들이 네이버와 같은 사이트에 접속하여 로그인을 한 뒤 해당 서비스를 이용한다. 어떻게 로그인 정보가 보존될 수 있는걸까? 서버와의 통신에서 자주 사용하는 http 프로토콜은 무상태성을 가진다. 즉 서버는 통신마다 사용자를 기억하지 못하며 사용자에 대한 데이터를 새로 받아와야 하는데, 이는 많은 불편함을 야기한다. 데이터를 유지하기 위해선 이를 저장할 수 있는 도구가 필요하다. 쿠키, 세션, 토큰이 이를 해결해준다.

💡 쿠키란

쿠키는 도메인 별로 브라우저의 저장 공간에 담은 key-value 형태의 데이터다. 만료 기한이 있지만, 이 전까지 브라우저에 저장되기 때문에 데이터를 지속적으로 유지할 수 있다.
쿠키는 데이터를 각 유저 브라우저에 저장하기 때문에 서버에 부담을 줄일 수 있다는 장점이 있다. 반대로 쿠키는 본인 혹은 제3자가 확인 및 수정할 수 있기 때문에, 보안상 중요하지 않은 데이터를 저장해야 한다.(맞춤형 광고와 같이 제3자가 쿠키 데이터를 사용할 수 있다.)

💡 세션이란

세션은 사이트의 서버가 관리하는 데이터다. 사용자가 로그인에 성공하면 서버는 사용자의 세션을 가리키는 키(세션ID)를 쿠키에 담에 사용자에게 전송한다. 이를 받은 사용자는 서버와의 통신마다 세션ID로 자신을 검증한 뒤 저장된 데이터를 이용하는 방식이다.
세션은 데이터를 본인 서버에 저장 및 관리하며, 사용자와의 연결을 관리할 수 있기 때문에 보안상 유리하다는 장점이 있다. 반면, 사용자와의 통신마다 서버와 통신해야 하기 때문에 사용자가 많아질 경우 과부하가 올 수 있다는 단점을 가진다.

💡 토큰이란

토큰은 사용자의 정보가 담긴 데이터를 암호화한 형태를 가진다. 사용자가 로그인을 하면 서버는 사용자 정보를 서버만 아는 키(비밀키)로 암호화 하여 사용자에게 전달한다. 사용자는 서버와 통신할 때 마다 토큰을 전송하며, 서버는 이를 확인하여 연결을 유지한다.
쿠키에서는 보안이 약점이었고, 세션에서는 서버 통신에 따른 과부하가 약점이었다. 토큰은 이 둘을 어느정도 해결해준다. 토큰은 서버의 개인키를 이용하여 암호화 되기 때문에 쿠키보다 보안성이 좋다. 또한 사용자측(쿠키, localStorage 등)에 저장되기 때문에 서버에 부담을 주지 않는다.
하지만 토큰에도 단점이 존재한다. 암호화된 토큰은 사이즈가 크기 때문에, 서버와의 통신에서 네트워크, 사용자의 브라우저에 과부하를 줄 수 있다.
또한, 서버는 토큰 하나만 보고 사용자를 판별하기 때문에 공격자가 토큰을 탈취하여 사용자인 척할 수 있으며, 일단 토큰이 탈취되면 이를 막지 못한다. 이는 토큰의 만료 기한을 짧게 두어 어느정도 해결할 수 있다.(원리를 알고싶다면 Access Token, Refresh Token을 검색해보자)

💡 어떤게 좋을까

쿠키와 세션은 보안과 서버 과부하의 트레이드오프라고 생각한다. 언어 설정, 장바구니 목록과 같이 중요하지 않은 정보는 쿠키에 저장하되, 결제 데이터, 개인 정보와 같은 중요 데이터는 세션에 저장하자. 데이터의 중요도 여부를 잘 판단하여 어느 영역에 저장할지 잘 상의해보자.
세션과 토큰 역시 보안과 서버 과부하의 트레이드오프라고 생각한다. 보안이 중요한 데이터를 저장하거나, 공격자를 실시간으로 관리하고 싶은 경우 세션을 이용하며, 그렇지 않은 경우 토큰을 이용하자.

💡 참고자료

profile
지속성장형 개발자 호찌. 학습하며 발생한 궁금증을 정리했습니다.

0개의 댓글