ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠키(Cookie)와 세션(Session) 개념
    네트워크 2022. 7. 3. 16:27

    쿠키(Cookie)

    #쿠키(Cookie)란?

    쿠키는 웹 서버가 사용자를 기억하고 식별하기 위해 브라우저에 저장하는 데이터입니다.

     

    사용자를 기억하기 위해 왜 쿠키를 쓰는 걸까요?

    웹서버와 클라이언트는 http 프로토콜로 통신을 하고 이 http 프로토콜은 stateless 방식입니다.

    Stateless란?
    ● 매 요청이 일회성이고 독립적으로 처리되는 방식.
    ● 서버가 클라이언트의 상태를 보존X 

     

    처음 사용자가 웹 사이트에 방문하면 웹 서버는 사용자에 대해서 아무것도 모릅니다. http 프로토콜이 stateless 방식이기 때문입니다. 웹 서버는 사용자가 다시 돌아왔을 때, 해당 사용자를 식별하기 위한 유일한 값을 쿠키에 할당합니다.

     

     

     

     

    #쿠키(Cookie)가 필요한 이유

     

     

     

    웹서버와 클라이언트는 stateless 방식으로 통신을 하기 때문에 위와 같은 기가막힌 현상이 발생한다.

    그래서 웹서버 입장에서는 사용자를 식별하고 추적할 수 있는 기술이 필요하고 그 기술 중 하나가 쿠키(Cookie)이다.

     

     

     

     

    #쿠키(Cookie) 동작 방식

    Set-Cookie: 서버에서 클라이언트로 쿠키 전달(응답)
    Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달

     

    사용자가 로그인을 하면 웹 서버는 사용자를 기억하기 위해 HTTP Response의 Set-Cookie 헤더에 사용자 정보 저장 후 전송

        @PostMapping("/login")
        public ResponseEntity login(@RequestBody LoginDto loginDto,
                                    HttpServletResponse response) {
    
            Member loginMember = loginService.login(LoginDto.getLoginId(), LoginDto.getPassword());
    
            Cookie idCookie = new Cookie("memberId", loginMember.getId()); //쿠키 생성
            response.addCookie(idCookie); //reponse에 쿠키 저장
    
            return ResponseEntity.ok().body();
        }

     

     

    웹브라우저는 HTTP Response Set-Cookie 헤더에 있는 정보를 쿠키 저장소에 저장

     

     

     

     

     

     

     

     

    #쿠키(Cookie) 구성요소

    이름=값

    필수 속성. '이름'과 '값' 모두 큰 따옴표로 감싸지 않은 세미콜론, 쉼표, 등호, 공백을 포함하지 않는 문자열이다.
    웹서버는 사용자가 추후 웹 서버에 다시 방문하면 읽어올 그 어떤 이름=값 조합이든 만들 수 있다.

    Set-Cookie: customer=Mary

     

    Expires

    선택적인 속성. 이 속성에는 쿠키의 생명주기를 가리키는 날짜 문자열을 기술한다. 일단 파기 일자에 다다르면
    그 쿠키는 삭제될 것이며 전달되지도 않을 것이다. 날짜의 형식은 다음과 같다.

    요일, DD-MM-YY HH:MM:SS GMT

    사용할 수 있는 타임존은 GMT뿐이며 날짜 요소 간에 구분자는 대시(-)여야 한다. 쿠키에 Expires를 명시하지 않으면 그 쿠키는 사용자의 세션이 끝날 때 파기될 것이다.

    Set-Cookie: foo=bar; expires=Wednesday, 09-Nov-99 23:12:40 GMT

     

    Domain

    선택적인 속성. 브라우저는 이 속성에 기술된 도메인을 사용하는 서버에게만 쿠키를 전송한다.
    이는 서버가 특정 도메인에만 쿠키를 제한적으로 전달하게 한다.
    도메인이 명시되어 있지 않으면, Set-Cookie 응답을 생성한 서버명을 기본값으로 사용한다.

    Set-Cookie: SHIPPING=FEDEX; domain="www.example.com"

     

    Path

    선택적인 속성. 이 속성으로 서버에 있는 문서에만 쿠키를 할당할 수 있다. 만약 Path 속성에 기술된 값이
    URL 경로의 앞부분과 일치하면, 쿠키를 전달한다.
    '/' 루트 경로를 Path 속성으로 지정하면 웹서버 모든 문서에 쿠키를 할당할 수 있다.

    Set-Cookie: lastorder=00183; path=/

     

    Secure

    선택적인 속성. 이 속성이 포함되어 있으면, 쿠키는 HTTP가 SSL 보안 연결을 사용할 때만 쿠키를 전송한다.

    Set-Cookie: private_id=519; secure

     

    HttpOnly

    XSS 공격방지
    자바스크립트에서 접근 불가(document.cookie)
    HTTP 전송에만 사용

     

    SameSite

    XSRF 공격방지
    요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송

     

     

     

     

    #쿠키(Cookie)와 보안문제

    쿠키 값은 사용자가 임의로 변경할 수 있다.

    ● 클라이언트가 쿠키를 강제로 변경하면 다른 사용자가 된다.
       Cookie: memberId=1 → Cookie: memberId=2 (다른 사용자의 이름이 보임)

    ● 실제 웹브라우저 개발자모드 Application Cookie 변경으로 확인

     

    쿠키에 보관된 정보는 훔쳐갈 수 있다.

    ● 쿠키에 신용카드 정보와 같은 민감한 정보가 있다면 이 정보가 웹 브라우저에도 보관되고, 네트워크 요청마다 계속 클라이언트에서 서버로 전달된다.
    ● 쿠키의 정보가 나의 로컬 PC가 털릴 수도 있고, 네트워크 전송 구간에서 털릴 수도 있다.

     

    해커가 쿠키를 한번 훔쳐가면 평생 사용할 수 있다.

    ● 해커가 쿠키를 훔쳐가서 그 쿠키로 악의적인 요청을 계속 시도할 수 있다.

     

     

     


     

    세션(Session)

    #세션(Session)이란?

    세션쿠키를 사용하여 사용자를 기억하고 추적하는데 그 사용자 정보를 서버에서 관리하는 기술입니다.

    세션이라는 것이 뭔가 특별한 것이 아니라 단지 쿠키를 사용하는데, 서버에서 데이터를 유지하는 방법일 뿐입니다.

     

     

     

     

    #세션(Session) 동작 방식

    로그인 요청 시 회원이 존재하는지 확인 후 세션ID를 생성해서 서버에 저장한다.

    ● 세션 ID를 생성하는데, 추정 불가능해야 한다.
       Set-Cookie: mySessionId=zHr48Qdx-bab9-4b92-9b32-dadb280f4b61

    ● 생성된 세션 ID와 세션에 보관할 값( memberA )을 서버의 세션 저장소에 보관한다.

     

     

    ● 서버가 세션을 Set-Cookie 헤더에 담아서 클라이언트에게 전송
       Set-Cookie: mySessionId=zHr48Qdx-bab9-4b92-9b32-dadb280f4b61

    ● 클라이언트는 전달 받은 쿠키를 쿠키 저장소에 저장

    ★ 클라이언트는 세션 ID만 저장할 뿐 사용자의 정보(신용카드 정보, 주민번호)는 가지고있지 않음

     

     

     

     

    ● 클라이언트는 요청시 항상 mySessionId 쿠키를 전달한다.
    ● 서버에서는 클라이언트가 전달한 mySessionId 쿠키 정보로 세션 저장소를 조회해서 로그인시 보관한 세션 정보를 사용한다.

     

     

     

    이와 같이 사용자 정보를 서버에서 관리하면 쿠키에서 발생하던 보안문제를 해결할 수 있게된다.

Designed by Tistory.