쿠키와 세션을 이해해보자!

maketheworldwise·2022년 3월 9일
0
post-custom-banner


이 글의 목적?

서버 개발자라면 반드시 알아야하는 개념 중 하나인 쿠키와 세션에 대해 정리해보자.

쿠키와 세션을 이해해보자

내가 정의하는 쿠키와 세션은 다음과 같다.

  • 쿠키는 웹 브라우저가 저장하는 데이터 정보 (로컬 디렉토리에 저장됨)
  • 세션은 서버가 저장하는 데이터 정보

쿠키 🍪

쿠키는 위에서 정의했듯, 브라우저가 저장하는 데이터 정보를 의미한다. 대표적으로 사용자 인증에서 많이 사용한다. 쿠키에는 이름, 값, 유효시간, 도메인, 경로 정보를 가지고 있다.

(도메인 정보의 경우에는 쿠키가 충돌이 날 경우와 보안적인 이슈로 인해 필요하다. 그리고 쿠키는 Same Site Cookie 전략과도 연관되어있는데, 이 내용은 나중에 다시 정리할 예정!)

쿠키의 동작 순서는 다음과 같이 이루어진다.

  1. 클라이언트가 페이지를 요청
  2. 서버에서는 쿠키를 생성하고 HTTP 헤더에 쿠키를 담아 클라이언트에게 전달
  3. 넘겨받은 쿠키는 클라이언트의 로컬에 저장
  4. 브라우저가 종료되어도 쿠키 만료 기간이 남아 있다면 계속 보관
  5. 이 후 서버에 페이지를 요청할 때마다 헤더에 쿠키를 담아 전달

세션 💾

세션은 서버에 저장하는 데이터다. 더 정확히 말하자면, 일정 시간동안 동일한 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다. 일정 시간이란 사용자가 브라우저를 통해 서버에 접속한 시점으로부터 브라우저를 종료하여 연결을 끝내는 시점을 의미한다.

세션은 클라이언트를 구분하기 위해 세션 ID(JSESSIONID)를 부여하고 브라우저를 종료할 때까지 유지한다. 서버에서 관리하기 때문에 쿠키보다 보안 측면에서 더 안전하지만, 사용자가 많아질 수록 서버 메모리를 많이 차지하게 되어 성능 저하의 요인이 될 수 있다.

  1. 클라이언트가 페이지를 요청
  2. 서버는 접근한 클라이언트의 헤더에서 쿠키를 확인하고 세션 ID가 있는지 확인
  3. 세션 ID가 없을 경우 새로 발급해주고 서버에 저장
  4. 클라이언트 재접속 시, 발급받은 쿠키로 서버에 전달

쿠키는 왜 헤더에 넣어서 관리할까?

이유는 굉장히 단순하다. 헤더에 담아서 관리하는 이유는 HTTP 프로토콜의 규약에 따르기 위함이다.

왜 필요할까?

결론부터 말하자면 HTTP 프로토콜의 단점을 보완하기 위해서다. 그럼 HTTP가 가진 단점이 뭘까?

HTTP가 가지고 있는 단점은 Connectionless, Stateless - 비연결지향이라는 점과 상태 정보를 유지하지 않는다는 특징에서 확인할 수 있다.

쿠키와 세션을 사용하지 않았다는 가정하에 예를 들어보자. 쿠팡에 로그인을 한 후 원하는 상품을 찾아 결제 페이지로 넘어가려고 하는데, 로그인을 했는지 안했는지에 대한 상태를 알 수 없기 때문에 처음에 로그인을 했음에도 불구하고 결제 화면에서도 로그인을 요구하는 상황이 발생한다.

즉, 상태를 유지할 수 없어서 사용자에게 불편함을 제공할 수 있다는 것이다.

(근데 이상하다? 분명 HTTP는 TCP 기반으로 만들어졌고, TCP는 연결지향형이라는 특징을 가지고 있는데 왜 비연결이라고 할까? 🧐 그 이유는 클라이언트가 요청을 해서 응답을 받으면 그 연결을 끊어버리는 특징 때문이다. HTTP에 대해서는 뒤에서 다시 정리할 예정이다.)

브라우저에서 쿠키를 제한한다면?

브라우저단에서 쿠키를 막는다는 것은 헤더에 쿠키를 넣는 것을 막는다는 의미와 같다. 그렇다면 어디에다가 쿠키를 넣어서 서버에 보낼 수 있을까? 답은 쉽다. URL 뒤에 파라미터로 보내는 방식을 이용하면 된다.

쿠키와 세션 보안적인 이슈

간단하게만 알아보자.

쿠키 해킹

쿠키 해킹은 해킹 사이트에서 가장 쉬운 문제로 분류된다. 쿠키를 이용한 해킹 방법은 쿠키에 담긴 정보를 변환하여 서버에 보내는 방식이다. 예를 들어, 쿠키에 다음과 같은 값이 있다고 가정해보자.

name : maketheworldwise
role : guest

게스트 권한이기 때문에 게스트 권한으로 접근 가능한 페이지만 접속이 가능하다. 하지만 다음과 같이 권한을 바꿔서 서버에 보내면 어떻게 될까?

(크롬 확장 프로그램에는 Edit This Cookie라는 플러그인으로 쿠키 변조가 가능하다! 👍)

name : maketheworldwise
role : admin

이렇게 되면 관리자 권한으로만 접속할 수 있는 페이지까지 접근이 가능해진다.

세션 해킹

세션 해킹은 Session Hijacking이라는 해킹 기법이 있다. 세션 하이재킹은 두 컴퓨터 간의 연결에서의 로그인 상태값을 가로채는 것을 의미한다. 사용자의 상태값을 가로채기 때문에 아이디와 패스워드를 몰라도 시스템에 접근하여 자원이나 데이터를 사용할 수 있게 된다.

즉, 세션 하이재킹은 공격자가 인증 작업이 완료된 - 정상적으로 통신하고 있는 다른 사용자의 세션을 가로채 별도의 인증 작업을 거치지 않고 가로챈 세션으로 통신을 하여 악의적으로 사용하는 해킹 기법이다.

출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jvioonpe&logNo=220240416313

대응 방안

쿠키보다 세션 기반 공격에서 상대적으로 안전하기 때문에 쿠키 기반 방식보다 세션이나 토큰을 사용하는 방식을 권장하는 편이다. 그리고 제 3자가 추론할 수 없게 사용자의 중요한 정보를 평문 사용을 금지하고 쿠키 값의 조작이 쉽지 않게 구성하도록 한다.

이 글의 레퍼런스

profile
세상을 현명하게 이끌어갈 나의 성장 일기 📓
post-custom-banner

0개의 댓글