쿠키와 세션

최지환·2023년 2월 13일
0

스프링

목록 보기
10/12
post-thumbnail
post-custom-banner

쿠키와 세션

HTTP 쿠키

HTTP 쿠키는 서버가 사용자의 웹 브라우저(클라이언트)에 전송하는 작은 데이터 조각이다.

브라우저는 데이터 조각(쿠키)를 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다.

서버에 두 요청이 들어온 경우, 쿠키를 통해 두 요청이 동일한 브라우저에서 등어왔는지 아닌지 판단할 수 있다.

→ 상태(Stateless)가 없는 HTTP 프로토콜에서 상태 정보를 확인 수 있게 해주는 수단이다.


HTTP 쿠키의 목적

  • 세션 관리(Session management)
    로그인, 사용자 닉네임, 접속 시간, 장바구니 등 서버가 알아야할 정보들을 저장한다. → 세션 이라는 개념은 뒷 내용에 다룰 예정
  • 개인화(Personalization) 사용자마다 다르게 그 사람에게 적절한 페이지를 보여줄 때 사용
  • 트래킹(Tracking) 사용자의 행동과 패턴을 분석하고 기록

쿠키 만들어보기

스프링에서 쿠키를 생성 할 때는 new Cookie()를 통해 만들 수 있다.

이후 responseaddCookie() 를 해 응답 요청에 쿠키를 넣어주면 된다.

예시 - 로그인 후, 아이디를 쿠키에 넣어 응답요청으로 반환한다.

@PostMapping("/login")
    public String loginForm(@Validated @ModelAttribute("loginForm") LoginForm form, BindingResult bindingResult, HttpServletResponse response) {

  //...

        //로그인 성공 처리
        //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시  모두 종료)
        Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
        response.addCookie(idCookie);

        return "redirect:/";
    }

응답 헤더 확인 - 브라우저의 개발자 모드로 확인

다음과 같이 쿠키에 memberId 가 1 으로 지정 되어 있는 것을 확인 할 수 있다.

이제 브라우저는 서버에 요청을 보낼 때 memberId=1 이라는 쿠키로 서버에 자신의 로그인 정보를 알릴 수 있다. 마치 상태를 갖고 있는 것처럼 요청을 보낼 수 있다.

이후 서버는 요청을 받을 때, 이런 memberId = 1이 라는 쿠키정보를 통해서 해당 요청이 어떤 유저의 요청인지 확인 할 수 있다.

쉽게 말해, 쿠키를 사용하여 로그인 id (memberId=1)을 전달해 로그인을 유지 할 수 있다. 하지만 이런 방식은 보안적으로 심각한 문제가 있다.

보안 문제

  • 쿠키 값은 임의로 클라이언트에서 변경 할 수 있다.
    • 쿠키에 지금과 같이 id 값을 갖고 있으면 해커가 이를 탈취 할 수 있다는 문제점이 있다.
  • 쿠키에 보관된 정보는 훔쳐갈 수 있다.
    • 이런 로그인 로직을 처리하는 중요한 값이 웹 브라우저에 보관되고, 네트워크 요청마다 클라이언트에서 서버로 전달이 된다. → 해커가 클라이언트, 네트워크 전송 구간 등 이를 해킹할 범위가 확대된다.

⇒ 이런 문제를 해결하기 위해 세션을 이용한다.


세션

서버에 중요한 정보를 따로 보관하고 연결을 유지하는 방법

→ 중요한 정보를 서버에 저장하고, 클라이언트에는 이에 대한 키 값을 쿠키에 넣어 전송하는 방식

세션의 동작 방식

1. 로그인 처리 요청이 들어오면 서버는 해당 요청이 올바른 요청인지 확인한다.(아이디와 패스워드가 맞는지)

2. 해당 사용자가 맞으면 세션 id를 생성하여 세션 저장소에 저장한다. 이때 세션 id가 key, 보관할 값(memberA)은 value로 저장한다.

💡💡💡💡
세션 Id는 UUID로 생성한다. UUID(범용 고유 식별자 universally unique identifier) 는 중복될 가능성이 거의 없다. UUID.*randomUUID*().toString(); 으로 uuid 스트링을 생성할 수 있다.
- UUID 예시
550e8400-e29b-41d4-a716-446655440000

3. 클라이언트는 쿠키 저장소에 세션ID를 저장한다.

여기서 중요한 포인트는 회원과 관련된 정보는 클라이언트에 직접 전달이 되지 않는다.

4. 이후 클라이언트가 요청을 보내면, 쿠키 저장소에 있는 세션 값이 담긴 쿠키를 보내고, 서버는 이를 받아 자신의 세션 저장소를 조회한다. 이때 세션id를 비교하여 로그인시 보관한 세션 정보를 사용한다.

요약

  • 세션을 사용해서 서버에서 중요한 정보를 서버에서 관리하고, 클라이언트에게 전송을 하지 않을 수 있다.
    → 보안 ⬆️
    - 쿠키 값을 변조 하더라도, 서버의 세션 저장소에 매핑된 키값과 다르기 때문에 회원정보에 접근 불가
    - 쿠키를 탈취 후 사용하더라도, 시간이 지나면 사용할 수 없도록, 서버에서 세션의 만료시간을 설정할 수 있다.
post-custom-banner

0개의 댓글