기타

쿠키와 세션 (Cookie & Session)

ziwookim 2022. 11. 1. 17:59

쿠키와 세션을 이용한 로그인 처리

쿠키와 세션을 이해하기 위해서는 HTTP 프로토콜에 대한 이해가 필요하다. 

HTTP의 비연결성(Connectionless), 무상태성(Statelss) 한 특징 때문에 Server가 Client를 식별할 수 있는 방법이 필요했고, 이 때문에 쿠키(Cookie)와 세션(Session)을 사용하게 되었다.

 

쿠키(Cookie)

 쿠키는 웹 브라우저가 보관하는 데이터이다. 웹 서버는 쿠키를 생성하여 웹 브라우저에 정보를 전송할 수 있다. 쿠키는 'key-value' 형태로 웹 브라우저의 쿠키 저장소에 저장된다. 서버로부터 쿠키를 전달받은 웹 브라우저는 이후 웹 서버에 요청을 보낼 때 쿠키를 헤더에 실어서 함께 전송한다. 이를 이용하면 웹 서버와 클라이언트는 필요한 값을 공유하고 상태를 유지할 수 있다.

 

클라이언트에 보관된 쿠키는 유효기간 설정이 가능하다. 

유효기간을 설정하면 쿠키는 특정 시간이 지나면 자동으로 소멸한다.

유효기간을 설정하지 않을 시에는 브라우저 종료와 함께 소멸합니다.

 

하지만 쿠키만으로 로그인을 구현하는 것은 한계가 있다.

쿠키는 네트워크를 통해 전달되기 때문에 중간에 쿠키를 탈취할 수 있다는 취약점이 있습니다.

이를 보완하기 위해 우리는 세션(Session) 을 사용한다.

 

세션(Session)

세션도 마찬가지로 클라이언트의 상태를 저장할 수 있다.

쿠키와 다른 점은, 쿠키는 각 브라우저의 개별 쿠키 저장소에 저장되는 반면, 세션은 서버에 저장이 된다.

웹 브라우저는 각각 별도의 세션을 갖는다. 각 세션을 구분하기 위해 세션 별 고유 ID 를 할당하고, 웹 서버는 각 브라우저에 세션 ID 를 전송한다. 웹 브라우저는 웹 서버에 연결 시 매번 세션 ID 를 보내서 웹 서버가 어떤 세션을 사용할 지 알 수 있도록 한다. 이 때, 웹 서버와 웹 브라우저가 세션 ID 를 주고받기 위해서 사용하는 것이 쿠키이다. (Tomcat 에서 발급하는 쿠키의 Key 는 JSESSIONID 입니다.)

 

로그인 과정

우리는 로그인 정보를 웹(웹 서버) 컨테이너 메모리의 세션 객체에 저장하게 되고, 클라이언트는 세션 ID를 전송하여 브라우저 고유 세션을 식별하게 된다. 이후 세션 객체 내부에 로그인 여부를 확인할 수 있는 특정 속성이 존재하면 로그인한 것으로 판단할 수 있다.


쿠키를 사용한 로그인 처리

서버에서 로그인 성공 시 쿠키를 담아 브라우저에 전달하면 브라우저는 해당 쿠키를 저장해두고,
해당 사이트에 접속할 때마다 지속해서 해당 쿠키를 보내준다.
 
로그인시 쿠키 생성

 

클라이언트에서 쿠키 전달
 

 

쿠키의 종류

사용자는 상황에 따라 입맛에 맞게 쿠키의 생명 주기를 설정해서 사용할 수 있다.

  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지

 

세션으로 동작하는 로그인

위에서 설명한 내용을 요약하면, 중요 정보는 서버의 세션 저장소에 key-value로 저장하고 브라우저에서는 key 값만 갖고 있도록 하는 것이다. 이 개념을 그림으로 표현하면 다음과 같다.

 

세션 기반 로그인 과정

 이제 다음 로그인이나 페이지 접근 시 쿠키에서 저장하고 있는 sessionId를 같이 전달하면 서버의 세션 저장소에서는 해당 sessionId를 key로 갖고 있는 value 값을 조회해서 로그인 여부와 중요 정보를 확인한다.

 

결국, 클라이언트와 서버는 쿠키로 연결 되어 있지만, 중요한 점은 다음과 같다.

 

  • 회원과 관련된 정보는 클라이언트에서 가지고 있지 않다.
  • 추정 불가능한 세션 아이디만 쿠키를 통해 주고받기에 보안에서 많이 안전해졌다.

 

여기에 더하여, 세션 아이디가 저장된 쿠키의 만료 시간을 짧게 유지한다면, 해커가 해당 키를 도용하더라도 금새 갱신되며, 사용하지 못하게 되어 보안 관련해서 좀 더 안전해질 수 있다.

 

정리

  • 쿠키를 가지고 로그인 상태를 관리하는 것은 코드도 복잡해지고 보안상 취약하다.
  • 중요한 정보는 클라이언트에 노출시켜서는 안되고 서버에서 관리해야만 한다.
  • 중요 정보는 서버에서 관리하며, 정보에 접근할 추리불가능하며, 중복 되지 않는 키를 이용해 서버와 클라이언트를 연결하도록 하며, 이를 세션이라고 한다.
 

 

 
 

 

 

 

 

출처:

https://hyuntaeknote.tistory.com/3

https://catsbi.oopy.io/0c27061c-204c-4fbf-acfd-418bdc855fd8