로그인으로 이해하는 쿠키 세션 토큰

namoo·2023년 4월 4일
0

HTTP 프로토콜에는 비연결성(Connectionless)과 비상태성(Stateless)라는 특징이 있습니다.

모든 사용자의 요청마다 연결과 해제의 과정을 거치면서 연결 상태를 유지하지 않고 연결 해제 후에도 상태 정보를 저장하지 않기 때문에 서버의 자원을 크게 절약할 수 있습니다. 하지만 이로 인해 사용자를 식별할 수 없어서 같은 사용자가 요청을 여러번 하더라도 매번 새로운 사용자로 인식하는 단점이 있습니다.

하지만 우리가 사용하고 있는 웹사이트를 생각해보면 로그인을 한 번 하고나면 그 사이트에서는 다시 로그인할 필요 없이 여러 페이지의 기능들을 이용할 수 있고 심지어 브라우저를 종료했다가 나중에 다시 접속했을 때도 그 로그인 상태를 유지할 수도 있습니다.
이것을 가능하게 하려면 다음 개념들에 대해 숙지 하여야합니다.

사용자 정보를 유지할 수 있는 쿠키(cookie)

쿠키는 브라우저에 저장되는 작은 텍스트 조각입니다.
대부분의 웹 브라우저의 최대 쿠키 크기는 4KB입니다. (여기서 4KB는 쿠키 이름, 쿠키 값, 쿠키 만료 날짜 등을 포함한 전체 쿠키에 대한 크기를 말합니다.)
쿠키의 데이터 형태는 Key 와 Value로 구성되고 String으로만 이루어져 있습니다.

chrome 브라우저에서 쿠키를 확인하는 방법!
1. F12를 눌러서 개발자모드를 켠다.
2. 더보기(>>) 버튼을 클릭하고, Application을 선택한다. 
3. 어플리케이션 화면 밑에 Storage라는 저장소가 있는데 여기서 Cookies를 선택

브라우저는 사용자의 컴퓨터에 설치된 소프트웨어이므로...쿠키는 사용자의 컴퓨터에 저장됩니다.
chrome의 쿠키의 저장 장소는 보통
「/Users/사용자명/Library/Application Support/Google/Chrome/Default」로 저장되어 있습니다.

쿠키는 사용자의 pc에 저장되므로 속도가 빠르고 서버의 자원을 낭비하지 않아 효율적입니다.

사용자는 쿠키(cookie) 정보를 확인 할 수 있고 삭제, 편집도 가능합니다.
다만 당사자뿐 아니라 제 3자가 조회할 수도 있기 때문에 보안상 민감한 정보를 저장하는것에는 적합하지 않습니다.

따라서 사용자에 의해 조작되거나 남에게 탈취되어도 크게 문제되지 않을 정보를 브라우저에 저장하여 웹사이트 이용을 편리하게 해주는것이 쿠키입니다.
ex) 웹페이지 다크모드, 자주보는 웹툰 목록, 팝업창의 다시 보지 않기 버튼, 검색 내역 저장, 쇼핑몰 장바구니

쿠키가 있기 때문에 여러 페이지를 이동할 때마다 로그인을 하지 않고 사용자 정보를 유지할 수 있습니다.

페이지를 이동해도 사용자의 로그인 상태를 유지하는 기능을 생각해 봅시다. 단순히 쿠키를 이용해 사용자의 아이디와 비밀번호를 쿠키에 저장한다면 보안에 매우 취약할것입니다.

사용자가 이미 서버로부터 인증받았음을 증명해 주는 세션(Session)

세션은 일정기간(로그인~로그아웃, 로그인~브라우저 종료) 사용자의 상태를 유지시키는 기술입니다.
사용자가 서버에 올바른 아이디와 비밀번호로 로그인에 성공하면 서버는 세션 아이디(session id)라는 데이터를 만듭니다. 보통은 ‘2sd98dbawix4’와 같은 식으로 알파벳과 숫자가 혼합된 형식을 갖고 있습니다.
사용자는 서버로부터 받은 세션 아이디를 쿠키로 저장한 다음 앞으로의 모든 요청에 함께 전달합니다.

세션의 동작 프로세스
1. 사용자가 서버에 쿠키정보와 함께 웹페이지를 요청(Request)함. 첫 요청시 session id가 존재하지 않음.
2. 서버는 사용자가 전달한 쿠키에 session id값이 있는지 확인하고, DB에서 값이 있다면 상태를 유지하고 없다면 새로 발급.
3. 사용자에게 웹페이지를 응답할 때, 쿠키에 session id값을 함께 전달. 이 쿠키는 사용자의 PC에 저장됨.
4. 이후 사용자는 전달받은 session id 값을 매 요청마다 헤더 쿠키에 넣어서 요청.
5. 서버는 session id를 확인하여 사용자를 식별.
	-  로그인을 요청하면 서버는 session을 로그인한 사용자 정보로 갱신하고 새로운 session id를 발급하여 응답
	-  로그인 사용자의 session id 쿠키를 요청과 함께 전달하고 서버에서도 로그인된 사용자로 식별 가능
6. 브라우저 종료 시 session id 제거, 서버에서도 세션 제거

브라우저 하나당 하나의 세션이 생성되고 해당 브라우저에서 들어오는 요청들은 모두 동일한 세션 아이디로 식별해서 처리합니다. 세션은 서버에서 관리되기 때문에 비교적 안전한 상태를 유지할수 있고 브라우저를 종료하면 자동으로 삭제되기 때문에 보안에도 좋습니다.
하지만 서버에 저장된다는 것은 수많은 사용자의 세션을 저장하고 요청이 들어올 때마다 확인해야 하므로 서버의 부담이 커지고 속도가 느려지는 단점이기도 합니다.

사용자 인증 정보를 암호화한 토큰(Token)-JWT

토큰은 서버에 부담이 적습니다. 메모리 공간을 많이 차지하는 세션 방식의 대안으로 로그인한 사용자에게 세션 아이디 대신 토큰을 발급해 주는 것입니다. 이러한 토큰에는 특수한 수학적 원리가 적용되어 있어서 서버만이 유효한 토큰을 발행할 수 있고 상태를 저장하지 않고도 로그인 여부를 파악해 줍니다.
또한 토큰은 확장성이 좋습니다. 일반적으로 웹 어플리케이션의 서버 확장 방식은 수평 확장을 사용합니다. 즉, 한대가 아닌 여러대의 서버가 요청을 처리하게 되는데, 이때 별도의 작업을 해주지 않는다면 세션 기반 인증 방식은 세션 불일치 문제를 겪게 됩니다. 이를 해결하기 위해서 Sticky Session, Session Clustering, 세션 스토리지 외부 분리 등의 작업을 해주어야합니다.
하지만 토큰 기반 인증방식의 경우 서버가 직접 인증 방식을 저장하지 않고, 클라이언트가 저장하는 방식을 사용하기 때문에 이런 세션 불일치 문제로부터 자유롭습니다. 이런 특징으로 토큰 기반 인증 방식은 HTTP의 비상태성(Stateless)를 그대로 활용할 수 있고, 따라서 높은 확장성을 가질 수 있습니다.
토큰은 마찬가지로 웹 브라우저에 저장되기 때문에 보안을 위해 유효기간을 짧게 설정해야 하지만 refreshf token을 활용해 유효기간을 늘리고 좀 더 편리하게 활용할 수 있습니다.
(오늘 말하는 토큰은 json web token(JWT)를 기준으로 설명됩니다)

profile
신입 개발자 나무!

0개의 댓글