Web

쿠키와 세션의 특징

apple-tree 2024. 6. 27. 01:47

쿠키와 세션을 왜 사용할까?

해당 이유를 알기전에 반드시 HTTP의 특징을 알아야 한다.

HTTP 특징

  • 비연결성
    • HTTP는 기본적으로 클라이언트가 서버에 요청을 보내게 되면, 서버는 해당 요청에 대한 응답을 내려준 뒤 연결을 끊는다.
  • 무상태성
    • 클라이언트와 서버의 HTTP 통신 과정에서 상태를 저장하지 않는다.
    • 그렇기 때문에 이전에 A라는 요청을 보내고, 그 후에 또 A라는 요청을 보내도 둘 사이의 요청은 아무런 관련이 없다.
      • 쉽게 풀어쓰자면 그냥 매 요청마다 ‘너는 누구인가~?’ 라는 형태이다. (서버가 클라이언트를 식별할 수 없다.)
    • 그래서 사용자 정보에 의존적인 기능을 구현할 때 어려움을 겪는다.
      • 상태를 저장하지 않으면 매번 로그인를 해야한다.

이러한 특징때문에 단점만 있다고 생각할 수 있지만, 덕분에 HTTP 통신 과정에서 불필요한 자원 낭비를 줄일 수 있다는 장점도 존재한다.

쿠키 (Cookie)

  • 브라우저에 저장되는 key와 value로 이루어진 작은 데이터 파일
  • 클라이언트에 대한 상태 정보를 저장하는 용도이다.
  • HTTP 요청시 따로 설정하지 않아도 자동으로 서버에 전달된다.
    • 때로는 불필요한 트래픽의 양이 많아진다. (과연?)
  • 사용자 브라우저에 저장되기 때문에 사용자가 직접 삭제하지 않는 이상 일정 기간 동안 데이터를 유지할 수 있다.
    • 이러한 이유로 보안에 취약하기에 인증 정보와 같은 민감한 데이터를 저장하는 것은 좋지 않다.

쿠키를 왜 사용할까?

사용자의 편의를 위한 기술이고, 웹 사이트 재방문 시 효율적으로 서비스를 제공하기 위해 사용한다.

많은 도메인 사이트들은 사용자를 추출한 다음 사용자에게 맞춤형 서비스를 제공하고 싶어하는데, 상태를 유지할 수 없는 HTTP 프로토콜의 특성상 불가능하기 때문에 쿠키를 이용해 상태를 저장한다.

동작방식

  1. 사용자가 웹 사이트에 처음 방문한다.
  2. 요청을 받은 서버는 브라우저에 대한 정보를 받은 쿠키를 생성한다.
  3. 생성된 쿠키 정보를 HTTP의 응답 헤더에 담아 클라이언트에게 전달한다.
  4. 전달받은 쿠키를 저장한 뒤 서버에 요청할때마다 쿠키 정보를 함께 전송한다.

궁금증 - 1

쿠키는 클라이언트 요청에 의해서 서버에서 만들어주는데 만약에 서버 없이 클라이언트 파일만 호출했을 때 어떻게 동작하지?

확인을 해보기위해 바탕화면에 index.html 파일을 만들어본 후 개발자 도구로 확인해봤다.

아무것도 없는 것을 확인했다. 동작방식을 잘 이해했다면 당연하게 느껴지겠지만, 뭔가 눈으로 확인해보니 이해가 빠르게 된 것 같다.

 

 

궁금증 - 2

서버에 아무것도 구현되지 않은 상태에서 localhost:8080 를 호출했을 때 과연 쿠키를 내려줄까?

너무 뻔한 이야기이지만 당연히 쿠키를 내려줄 수 없다. 왜? 클라이언트에서 어떠한 정보도 보내주지 않았고, 서버에서는 받은 정보를 기반으로 쿠키를 만들어주는 코드를 작성하지 않았으니까..

실제로 확인해보자

@RestController
public class TestController {

	@GetMapping("/")
	public String index() {
		return "hello world";
	}

}

테스트용 컨트롤러에 다음과 같이 코드가 작성한 후 실행해서 동일하게 쿠키 값을 확인해보자

 

당연하게 없는 것을 확인했다.

쿠키의 단점

쿠키는 브라우저에 저장되기 때문에 다음과 같은 단점들이 존재한다.

  1. 유실되기 쉽다.
    1. 브라우저에 쿠키 일괄 삭제 기능이 제공되기 때문에 유실되기 쉽다.
  2. 변조와 도난되기 쉽다.
    1. 브라우저의 개발자 도구를 사용하면 어떤 쿠키가 저장되어 있는지 한 눈에 확인되기 때문에 쉽게 변경할 수 있고, 도난될 확률도 높아진다.

쿠키의 대체 기술

로컬 스토리지나 세션 스토리지를 사용하면 된다고 한다. 하지만 여기까지 깊게 공부하진 않겠다. 필요하다면 나중에 포스팅해보는걸로!

그 외에도 쿠키의 보안 속성을 설정함으로써 쿠키의 단점을 조금이나마 해결할 수 있다.

세션

  • 웹 사이트에 이용되는 사용자 정보를 서버에 저장하는 기술이다.
  • 일정 시간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시켜준다.
  • 클라이언트로부터 요청이 오면 서버에서 세션 ID를 만든 후 응답헤더에 Set-Cookie를 통해 쿠키에 세션 ID를 전달한다.

세션은 왜 서버에 있을까?

쿠키에 sessionid 외의 정보를 기록하지 않음으로써 안정성이 확보된다.

그렇기 때문에 쿠키가 탈취 되더라도 상대적으로 안전하다.

동작방식

  1. 사용자가 웹 사이트에 처음 방문한다.
  2. 서버는 클라이언트가 요청을 보낼 때 세션 ID가 있는지 확인한다.
  3. 세션 ID가 존재하지 않는다면 서버는 세션 ID를 발급하여 클라이언트에게 내려준다.
  4. 클라이언트는 세션 ID를 쿠키에 저장하고, 이후 요청 시 세션 ID를 서버에 보낸다.
  5. 서버는 세션 ID를 확인한 후 클라이언트에 맞는 요청을 처리해준다.

궁금증 - 1

세션은 서버에서 발급해준다. 세션 ID 값을 자세히 확인해보면 뭔가 암호화 되어있는 것처럼 보인다.

음,,그럼 세션 말고 처음부터 사용자 정보를 브라우저에서 암호화시켜서 서버에 전송하는 방식을 선택하게 되면 세션을 사용하지 않아도 되지 않을까? 라는 생각이 들었다.

아마 나와 동일하게 생각하는 사람들이 있을거다..내 생각이지만 쿠키는 아무리 브라우저에서 암호화를 하더라도 결국 변조와 도난이 쉽다.

그러면 또 이런 생각이 든다 결국 세션도 쿠키에 저장되는 데이터인데 왜 쿠키보다 보안적인 측면이 좋다고 하는걸까?

물론 세션도 변조와 도난될 수 있다. 이를 세션 하이재킹이라고 한다. 하지만 세션 ID값은 서버에서 암호화과정을 거친 값이고, 임의로 수정하게 된다면 유효하지 않은 값이 된다. 추가적으로 서버 측에서 세션값에 대한 검증 프로세스를 거치기 때문에 쿠키보다는 보다 더 나은 안정성을 갖게 된다.

쿠키는 브라우저에 저장되는데, 세션은?

쿠키는 브라우저 스토리지에 저장된다는 것을 눈으로 쉽게 확인할 수 있다.

그렇다면 세션은 어디에 저장될까? 막연하게 서버에 저장된다고 이야기하지만 굳이 찾아보면 서버 메모리에 저장된다.

 

궁금증 - 2

스프링 부트을 공부하면서 개발자 도구로 결과를 확인하다보면 쿠키에 JSESSIONID 라는 key값이 있다. 세션을 만들어준적도 없는데 왜 세션 ID가 발급될까??

어디서 발급되는지 정말 궁금해서 직접 실행해본 결과

요청받는 컨트롤러의 메소드 선언부에 HttpSession이 있는 경우에 자동으로 만들어진다.

세션 기반 사용자 인증이란?

말 그대로 세션 기반으로 사용자를 인증하는 방식을 말한다.

 

 

'Web'의 다른글

  • 현재글 쿠키와 세션의 특징