쿠키(Cookie)와 세션(Session)
동아리 프로젝트 기획 단계에서 '로그인 기능을 어떠한 방식으로 구현하는 것이 효율적일까?' 라는 생각을 하게 되어,
OAuth, JWT 등 여러 방법들 중에서도 쿠키와 세션을 이용한 로그인 방식을 우선적으로 공부하여 정리합니다.
쿠키(Cookie)란?
쿠키(Cookie)란 서버가 사용자의 웹 브라우저(Client)에 저장하는 데이터입니다.
쿠키의 형태는 Key : Value의 String 형식으로 이루어져 있습니다.
쿠키당 최대 4Kb까지 저장할 수 있으며, 쿠키 표준안인 RFC2109에 따르면, 300개까지 만들 수 있습니다.
다만, 브라우저마다 저장되는 쿠키가 다르기 때문에, 예를 들어 크롬에 남긴 쿠키는 IE에서 사용할 수 없습니다.
(브라우저가 다르면 서버는 다른 사용자로 인식합니다.)
Session Cookie & Permanent Cookie
Session 쿠키는 웹 브라우저가 종료될 때 제거됩니다.
만약, 브라우저의 종료 여부와 상관없이 쿠키를 유지하고 싶다면, Permanet 쿠키를 이용합니다.
Permanent 쿠키는 쿠키를 생성할 때, Expires 또는 Max-Age 옵션을 추가합니다.
Expires: 쿠키가 만료될 날짜를 지정
Max-Age: 현재 시간을 기준으로 쿠키를 유지할 기간 지정
Server to Client (Expires 지정)
Set-Cookie: id=gd539asd12409; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Server to Client (Max-Age, 단위: Sec)
Set-Cookie: id=gd539asd12409; Max-Age=3600;
Expires 또는 Max-Age를 지정하지 않으면, Session 쿠키로 간주하여 브라우저 종료시 쿠키가 소멸합니다.
또한, 이처럼 서버에서 클라이언트로 쿠키를 지정하면,
이후에는 해당 클라이언트는 매번 저장된 쿠키를 헤더에 포함해서 서버에 요청해야 합니다.
쿠키를 사용한 로그인 처리
클라이언트에서 서버로 로그인을 요청하고, Header에 사용자 식별 Id를 쿠키에 담아 전달합니다.
그러면, 클라이언트에서는 해당 쿠키를 저장해두고 사이트에 접속할 때마다 서버에 쿠키를 함께 전달합니다.
로그인 처리 외에 쿠키의 용도
쿠키가 있으면, 다른 페이지로 이동할 때마다 로그인을 계속 하지 않고 사용자 정보를 유지할 수 있습니다.
- 30일간 다시 보지 않기. (쿠키에 체크한 날짜를 기록하고, 재방문시 시간차를 계산)
- 비로그인 쇼핑몰 장바구니
- 최근 검색 결과를 바탕으로 제품 추천
- ID 저장, 자동 로그인
세션(Session)이란?
세션(Session)이란 사용자가 브라우저를 통해 웹 서버에 접속한 시점부터 종료하는 시점까지,
일련의 요청들을 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술입니다.
세션을 사용한 로그인 처리
Session은 쿠키에 비밀번호와 같은 인증 정보를 저장하지 않고, 대신 JSESSIONID(session id)라는 사용자 식별자를 저장합니다.
만일 쿠키에 SessionId가 존재하지 않다면, 서버에 요청하여 SessionId를 받아 쿠키에 보관합니다.
그 다음, 클라이언트가 서버에 요청을 할 때, 서버는 sessionId를 Key로 가지고 있는 value값을 조회하여 로그인 여부와 중요 정보 등을 확인합니다.
세션의 특징
- 세션 아이디(JSESSIONID)를 브라우저 단위로 저장하고, 브라우저 종료시 소멸됨.
- 로그인한 유저 외에도 세션을 생성함. (= 로그아웃을 하면 새로운 사용자로 인식.)
- 사용자 로그인 여부, 닉네임 등 정보들을 세션에 담아두면 불필요한 DB 접근을 막을 수 있음.
- 서버에 데이터를 저장하기 때문에, 사용자 개인 컴퓨터보다 비교적 안전함.
단순히 쿠키만으로 상태를 관리하면, 사용자의 개인정보가 클라이언트에 저장되어 있기 때문에,
위변조 및 도용 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 중요한 데이터들은 클라이언트가 아닌, 서버에서 관리하도록 하고 외부로 노출되지 않도록 해야 합니다.
따라서 클라이언트는 서버의 데이터를 요청할 수 있는 JSESSIONID만 가지고 있고, 이 키 또한 유효시간을 짧게 설정하고 갱신을 반복하면 보안적으로 안전해질 수 있을 것입니다.
내용에 오류가 있거나, 질문이 있으신 분들은 댓글을 남겨주시면 감사하겠습니다! 😊
이미지 출처 : https://catsbi.oopy.io/0c27061c-204c-4fbf-acfd-418bdc855fd8