728x90
반응형

세션

사용자가 웹 브라우저를 킨다고 가정해보자. 예를 들어서 http://www.naver.com을 웹 브라우저에 입력하였다. 최초로 웹브라우저에 들어가면 일단 서버는 해당 주소에 맞는 controller 메서드를 찾아서 html을 사용자에게 리턴해줄 것이다.
그런데 다음에 접속할 때는 상황이 다르다. 서버는 이제 사용자가 누구인지 알아서 거기에 따른 맞춤 광고나 정보들을 제공해준다. 다음에 요청할 때는 세션 ID라는 것이 같이 전송되기 때문이다. 여기서 세션 이라는 것을 처음 접할 수 있다.

웹 브라우저는 세션 ID를 받아서 특정한 설정을 안해주는데도, 자동으로 웹 브라우저에 쿠키라는 저장 영역에 세션ID가 담기게 된다. 이 쿠키라는 영역에 담기는 세션 ID는 언제 생기냐 하면, 최초로 사용자가 서버에 요청했을 때 생기게 된다.

만약에 최초 요청이 아니라, 두번째, 세번째 요청일 시 세션 ID를 header 영역에 달고 요청하게 되는 것이다. (header안에 쿠키라는 영역이 있다)

세션ID는 그럼 뭘 확인해주는가? 세션 ID는 처음 접속했는지, 아니면 2번째, 3번째 접속했는지를 알 수 있다.

여기서 그럼 이런 생각을 할 수도 있다. 세션 ID를 위조해서 header의 쿠키에 넣어서 전달하면, 내가 아닌 다른 사람으로 서버가 인식한다는 것이니까, 위조를 할 수 있는 것 아닐까?

그럼 세션 ID를 위조할 수는 없을까?

이를 방지하기 위해서 세션 ID를 만들어줄때마다 서버는 세션ID의 목록을 가지고 있어야 된다.

즉, 세션ID는 최초 요청 시에 만들어지고, 웹 브라우저는 계속 요청할때마다 세션ID를 들고간다.

그럼 세션ID는 언제 사라지게 되는 것일까? 3가지 경우가 있다.

  1. 서버 쪽에서 session 목록을 날려버릴 때
  2. 사용자가 브라우저를 닫을 때 (종료할 때) -> 서버에 값이 살아있지만 특정 시간(보통 30분)이 지나면 이것도 사라짐
  3. 특정 시간이 지났을 시 -> "우리가 세션이 종료되었습니다. 다시 로그인해주세요" 이런 메시지가 오는 경우 생각

세션을 사용한 로그인

세션을 로그인할 때 사용한다면 로직은 다음과 같다.

  1. 유저가 처음에 서버에 요청을 한다.
  2. 서버는 세션에 세션ID를 하나 만들어주고(ex> 1234) 서버 세션공간에 기록해둔다.
  3. 서버는 유저에게 응답(response)를 돌려준다.
  4. 유저가 다음 요청을 하게 될 때는 세션 1234를 쿠키에 넣어서 이번엔 로그인을 요청한다.
  5. 서버는 DB에 로그인 정보가 있는지 확인한다.
  6. 해당하는 user가 있다면, 서버의 세션에서 세션ID가 1234인 곳에 user 정보를 저장하게 된다.
  7. 그럼 이제 다음번에 사용자가 예를 들어 사용자 프로필 화면에 접속했다고 하면, 세션 있는지 먼저 확인한다
  8. 세션이 있다면 DB에서 사용자 정보를 찾아서 서버에 응답해준다.
  9. 해당 정보를 돌려준다!

즉, 세션을 통해서 그 사용자 인증도 할 수 있고, 민감한 정보를 요청할 때 세션을 통해서 세션값이 있는지 확인하고 정보가 존재하는지 확인한다.

세션의 단점

세션의 단점에 대해서 생각하려면 사용자가 많을 때를 가정해봐야 한다.
만약 서버가 100명을 처리할 수 있는 서버인데, 1000명이 동시에 접속했다고 가정해보자. 그럼 900명은 대기해야한다. 그래서 회사는 서버를 늘리고 싶어한다. 늘리면 당연히 1000명을 받을 수 있을텐데 문제는 세션이다.

세션은 서버에 같이 존재하는데, 만약 이전 서버에 로그인해서 세션에 기록되었다면 새로 늘린 서버에 접속하면 해당 서버의 세션에는 로그인 정보가 없기 때문에 로그인이 잘 되었는지 이용자에게 전달해줄 수 없는 문제가 생긴다.

이걸 해결하려면 몇 가지를 생각해볼 수 있다.

  1. 먼저 Sticky Server라는 것을 만든다. 이 서버는 이제 최초에 들어온 사람은 로드 밸런싱 이런거 없이 무조건 처음 접속한 서버로만 들어가게 강제하는 것이다.
  2. 아니면 세션 전체를 복제시켜서 서버마다 세션을 저장해줄 수 있다.
  3. 또, 세션에 저장하는 게 아니라 다른 한 군데 데이터베이스에 값을 넣고 이걸 세션이라고 생각해서 공유해서 사용하는 것이다.

문제는 해결책들이 기존의 세션의 장점을 사라지게 한다.

세션은 일단 서버에 인메모리 즉, 속도가 빠르다는 장점이 있는데, 3번째 방법은 데이터베이스를 따로 둔다는 것은 하드디스크에서 읽어와야 하기 때문에 속도가 느려진다. (하드디스크에 접속한다는 것은 I/O가 일어난다는 것이기 때문에..)

그래서 현재 세션을 사용하는 서버들은 DB가 아니라 메모리 공유 서버를 사용한다. 그래서 모든 서버들이 메모리 서버에 접근하는데 여기서 나오는 대표적인 인메모리 데이터베이스가 Redis이다.

세션을 사용하지 않고, JWT 토큰을 사용하는 방법이 더 많이 사용된다. JWT 토큰에 대해서도 정리해보겠다.

728x90
반응형
728x90
반응형

쿠키와 세션을 사용하는 이유는 Http의 특성 때문이다.

http는 connectionless와 stateless의 특성을 가지고 있는데, connectionless는 클라이언트가 서버에 요청했을때 응답 이후 연결을 끊어버리는 속성이고, stateless는 connection이 끊어지고 나면 상태정보 유지를 하지 않는다는 속성이다.

이러한 특성을 해결하기 위해 쿠키와 세션을 사용한다.

쿠키

  • 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
  • http에서 정보가 필요할 때 재사용 가능하다.
  • 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다.
  • 클라이언트에 300개까지 쿠키저장이 가능하고 하나의 도메인당 20개의 값만 가질 수 있다.
  • 하나의 쿠키값은 4KB까지 저장한다.
  • 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 Request Header를 넣어서 자동으로 서버에 전송한다.
  • 쿠키의 동작 방식
    • 클라이언트가 페이지를 요청
    • 서버에서 쿠키를 생성
    • HTTP 헤더에 쿠키를 포함시켜서 응답
    • 브라우저가 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
    • 같은 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄
    • 서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답
  • 쿠키 사용 예
    • 방문 사이트 로그인 시, “아이디와 비밀번호를 저장하시겠습니까?”
    • 쇼핑몰의 장바구니 기능
    • 자동로그인 시, 팝업에서 “오늘 더 이상 이 창을 보지 않음” 체크

세션

  • 세션은 웹 브라우저를 시작하여 종료할 때까지 상태를 유지시켜준다.
  • 세션도 쿠키를 기반하고 있지만, 쿠키와는 달리 사용자 정보 파일을 서버에서 관리한다
  • 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속하여 브라우저를 종료할 때까지 인증상태를 유지한다
  • 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정이 가능하다
  • 사용자에 대한 정보를 서버에 두기 때문에, 서버 메모리를 많이 차지하게 된다
  • 가장 큰 차이점은 저장 위치 및 서버 사용여부이다. 쿠키는 클라이언트 로컬에 저장하여 사용하지만, 세션은 서버의 자원을 활용한다.
  • 세션의 동작 방식
    • 클라이언트가 서버에 접속 시 세션 ID를 발급 받음
    • 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장하고 가지고 있음
    • 클라이언트는 서버에 요청할 때, 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청한다
    • 서버는 세션 ID를 전달받아서 별다른 작업없이 세션 ID로 세션에 있는 클라이언트 정보를 가져와서 사용한다
  • 각 클라이언트에게 고유 ID를 부여한다
  • 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공한다
  • 보안 면에서 쿠키보다 우수하다

보안 면에서는 세션이 쿠키보다 높지만, 서버의 자원을 활용하기 때문에 무분별하게 사용할 수는 없다.

중요한 차이점은, 라이프사이클이 세션은 웹브라우저가 종료되면 끝나지만, 쿠키는 사용기한과 데이터 파일이 있는 한 브라우저가 종료되어도 유지된다.

속도는 세션보다 쿠기가 더 빠르다.

 

[참고]

https://interconnection.tistory.com/74

 

쿠키와 세션 개념

노션 페이지(아래 내용과 동일) 개요 쿠키와 세션은 개발자 말고도 인터넷 사용자라면 누구나 많이 들어본 단어입니다. 하지만 개념에 대해서는 많은 사람들이 헷갈려 하기에 쉽고 간단하게 정

interconnection.tistory.com

 

728x90
반응형

+ Recent posts