[web] Cookie vs Session, 그리고 HTTP

두비니

·

2021. 1. 4. 00:27

 

 

 

 

오늘은 쿠키와 세션에 대해서 써보려고 합니다!

쿠키 공부하다 보니깐 둘이 헷갈리는 개념인거 같아 정리할 겸 글을 씁니다.

맛잇어욯ㅎㅎ

저는 초코쿠키가 좋아요

 

 

일단 세 가지에 대해서 이야기 하기 전에 HTTP에 대해서 이야기 해봅시다.

 

 

0. HTTP란?

우선 HTTP는 Hyper Text Transfer Protocol의 줄임말로, 인터넷에서 정보를 주고 받을 때 지정해 놓은 프로토콜입니다.

무슨 얘긴지 모르겠다구요?

프로토콜은 기본적으로 규칙이라고 보시면 됩니다. 예시를 들어볼까요?

 

예를 들어 두 사람이 이야기를 하려고 합니다.

위처럼 둘다 한국말을 할 수 있는 상황이면 정말 좋겠지만

 

 

다음과 같이 A는 한국말 밖에 못하는 상황인데, B는 A에게 영어로 소통하려고 하면 당연히 소통이 이루어지지 않겠죠?

따라서 A와 B가 만날 때에는 한국말을 씁시다라는 약속을 정하는게 효율적이겠죠?!!!

 

여기서 한국말을 씁시다라는 약속이 HTTP 프로토콜에 해당되는 거고, A와 B가 만날 때인터넷에서 정보를 주고 받을 때가 되는 것이죠!

 

이정도면 간단히 HTTP를 이해하는데 충분하다고 생각합니다.

HTTP를 이해하는 데는 2가지 핵심 요소만 기억하면 됩니다. Connectionless 그리고 Stateless.

우선 Connectionless입니다. 뜻으로만 보면 비연결성이라는 뜻입니다.

 

이건 클라이언트(우리)가 서버에 요청을 보내면 서버는 클라이언트에 응답을 하고 접속을 끊는 특성이 있습니다. 

 

 

이런 특성을 가진 이유는, 불특정 다수와 통신을 해야 하는 인터넷에서 모든 유저들과 연결을 계속 유지하는 경우, 많은 비용이 발생하게 됩니다. 더불어 그 사람들이 언제까지 이용할 지도 모르고요. 따라서 효율적인 연결 유지를 위해 비연결성을 사용합니다.

 

 

두 번째는 Stateless, 무상태입니다. HTTP는 비연결지향성 때문에 요청을 응답한 뒤에는 접속을 끊습니다. 따라서, 요청을 받는 클라이언트의 상태 그리고 정보를 알 수 없습니다.

 

예를 들어서 쇼핑몰에서 로그인을 한 뒤, 한 상품을 장바구니에 넣어놓고 싶다고 가정합시다.

그런 상황이면 원칙적으로는 다음같은 상황이 그려지는 거죠.

 

 

로그인을 하고, 상품을 고르고, 장바구니에 담는 과정은 각각 다른 요청(request)로 처리되기 때문에, 서버는 무상태의 특성에 따라 로그인했던 유저의 정보를 기억할 수 없습니다.

 

그렇다면 우리는 평소에 인터넷을 이용할 때 이런 번거로운 과정 없이 이용할 수 있을까요?

 

여기서 쿠키, 세션의 개념이 나옵니다.

 

1. Cookie

 

아까전에 이야기했던 비연결성과 무상태 기억하시나요?

결국 클라이언트들에게 매우 불친절한 특성들인데, 우리가 매번 직접 자신임을 증명할 필요가 없이 이 쿠키라는 친구가 대신 증명해주는 것입니다.

 

쿠키는 클라이언트 쪽(브라우저)에서 관리되는 정보 파일입니다.

클라이언트가 페이지를 요청하면, 서버가 쿠키를 생성해서 이 쿠키를 클라이언트에게 보냅니다.

그러면 이 받은 쿠키를 이용해 매번 서버에게 요청(request)와 같이 보내는 겁니다.

 

정말 간략히 표현하자면 이런 상황인거죠

 

이런 상황이 브라우저가 종료되어도 쿠키의 만료 기간이 끝나지 않았다면 지속적으로 보관하고, 나중에 다시 서버에 요청할 때도 쿠키를 같이 전송을 하는 것이죠.

 

그리고 여기에서 중요한 점은 이 쿠키 전송의 과정은 모두 클라이언트쪽에서 관리합니다. 

 

아니, 맨 처음에 서버가 쿠키를 클라이언트한테 전달해준다면서요

 

라고 하신다면, 서버가 전달하는 쿠키는 "나 너가 A인거 인정"이라는 내용을 담아서 전달하는 것 뿐입니다. 일련의 요청이 종료되고 나서는 서버는 이 쿠키를 구웠다는 사실마저 잊어버립니다. 무슨 느낌인지 아시겠죠?

 

 

2. Session

 

다음은 세션입니다.

세션은 기본적으로 쿠키랑 같은 개념입니다. 일련의 정보를 미리 저장해놓고, 까먹었을 때 꺼내보기 위해 사용되는 것들입니다. 다만 여기서 중요한 점은 서버가 관리한다는 점이죠.

 

그럼 어떤 정보들을 서버가 관리할까요?

쿠키는 보안에 굉장히 취약합니다.

요즘에는 쿠키들이 암호화되서 주고받아지지만, 아무튼 인터넷상에서 주고받아지는 것이고, 이는 어딘가에는 노출되어있다는 뜻이니까요.

이런 쿠키에 사용자의 비밀번호같은 중요한 개인정보를 심어넣는 것은 매우 무모한 짓이겠죠? 따라서 이렇게 보안상 중요한 부분들만 서버가 선별하여 세션으로 관리하게 됩니다.

 

그래서 주로 서버는 클라이언트를 구분하기 위해 세션을 사용합니다.

구분하기 위해 세션ID를 구분해서 부여합니다. 

그 세션ID를 처음 접속 할 때 전송하는 것입니다.

그 뒤로는 쿠키에 부여받은 세션도 함께 전송하는 것입니다.

 

 

대충 느낌이 오시죠? 한가지 더 중요한 것은 이 세션은 말그대로 한 세션에만 유효합니다. 즉, 브라우저를 끄고 다시 들어간다면 서버는 나간 클라이언트에 대한 세션ID를 삭제하고, 다시 들어온 클라이언트에 대해 새로운 세션ID를 생성합니다.

 

 

 

여기서 유의해야할 점은 세션도 서버 쪽에서 관리를 하기 때문에 비교적 안전하다는 것이지, 

결국 세션정보도 중간에 탈취당할 수 있기 때문에 완벽하게 안전하다고 할 수는 없습니다.

다만 이걸 아이디/비번을 통채로 유출당하는 것보다는 낫다...정도의 느낌으로 보시면 됩니다.

 

3. Cookie vs Session

 

이제 둘에 대해서 알아봤는데, 대충 가지고 있는 대상만 다르고, 결론적으로 하는 일은 같은 걸 확인할 수가 있습니다.

그러면 충분히, 왜 굳이 둘이 따로 있는거지? 라는 생각이 들죠.

 

이 둘이 있는 이유는 위에서도 말했다시피 보안의 문제때문에 그렇습니다.

 

따라서 어떤 정보를 쿠키에 넣고, 어떤 정보를 세션에 넣을지 정하는 것은 매우 중요한 일입니다. 왜냐하면 너무 많은 정보를 세션에 저장하게 되면 서버가 너무 느려지고, 너무 많은 정보를 쿠키에 저장하게 되면 보안에 있어 취약해지기 때문이죠. 

 

그리고 한가지 차이점이 더 있다면

쿠키는 브라우저를 종료시켜도 유효기간이 남아있다면 저장되는 반면, 세션은 유효기간이라는 개념 자체가 없고 브라우저가 종료되는 순간 삭제된다는 점 또한 다르겠네요.

 

 

4. 보안의 관점에서?

 

일단 이런 방법들의 최대 장점은 편하다는 것입니다. 여러번 로그인을 할 필요가 없어지는 것이고, 심지어 컴퓨터를 껐다가 켜도 로그인 상태가 유지가 될 수 있죠.

 

그러나 이걸 공격자의 입장에서 바라보게 된다면, 이 쿠키는 어느 곳에 저장되는 정보이고, 이를 캐낼 수 있다면 다른 사람인 척 위장 또한 가능해지는 것이죠.

 

+) 이에 관련한 문제?

dokhakdubini.tistory.com/343

 

[web] cookie write-up

[web] Cookie (100 pts) 쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다. admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다. 문제에 접속하면 단순히 로그인을 하는 사이트가

dokhakdubini.tistory.com

 

따라서 3번에서 말했다시피 어떤 정보를 쿠키에 저장할지, 세션에 저장해야 할지 잘 생각해야 합니다. 

그리고 기업이 쿠키를 주거나 요구하는 것은 유효기간 내에 제한없이 이용할 수 있기 때문에, 이걸 적당한 선에서만 이용을 하는 것이 중요하겠죠.

 

아무튼 요즘에는 이런식으로 쿠키를 사용할거냐고 물어봅니다

동의를 하고 나서는 언제 만료가 되는지 확인하고, 쿠키가 암호화되어 사용되고있는지 확인하는 것이 매우 중요하다고 생각합니다.

 

다음 글은 조금 더 전문적인 시선으로 네트워크 기반 이야기를 더 써보려고 합니다.

감사합니다!

'WEB' 카테고리의 다른 글

[PHP] Magic Hash  (0) 2021.03.26
[PHP] strncmp 취약점(인증우회)  (0) 2021.03.21
[PHP] preg_match함수 알아보기  (0) 2019.12.30
[React] React에 대해서  (0) 2019.11.17
React를 위한 Javascript 명령어들  (0) 2019.11.16