-
최근 면접질문 중 cookie httponly속성이 무엇인지 물어보았고 답을 하지 못하였다.
그래서 이를 공부해 봐야겠다고 생각해 블로그를 적는다.
쿠키란
인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해
인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일이라고 이해하면 된다.
이런 개념이 생긴 이유는
클라이언트가 서버에 요청을 보내고 서버로부터 오는 응답을 대기한다.
그럼 서버는 요청에 대한 결과를 응답한다.
그런데, 이 때 서버는 클라이언트의 상태를 보존하지 않는다. 이특성을 무상태(Stateless)라고 한다.
서버는 기본적으로 브라우저에 요청에 대한 결과를 반환하고 바로 연결을 끊기 때문에
이전 요청을 기억하지 못한다. 한마디로 브라우저를 기억하지 못한다.
따라서 서버는 유저에게 어떤 정보를 추가적으로 보내줌으로써
다시 유저가 서버에게 요청할 때 누가 요청했는지 알 수 있게 한다.
하지만 요청할 때마다 추가 정보를 넣는 것도 보안 측이나 개발할 때 굉장히 좋지 않을 것이다.
그래서 쿠키라는 개념이 등장하였다.
쿠키 헤더
쿠키와 관련된 헤더 두 가지를 살펴보자
Set-Cookie 헤더
- Response에서 사용
- 서버에서 클라이언트로 쿠키 전달
Cookie 헤더
- Request에서 사용
- 클라이언트가 서버에서 받은 쿠키를 저장
- 요청 시에 서버로 전달
쿠키를 사용한 요청과 응답의 흐름을 봐보자
1. 브라우저가 서버에 요청을 보낸다.
2. 서버는 받은 정보를 바탕으로 쿠키를 만들어 브라우저에게 Set-Cookie 헤더를 통해 응답에서 쿠키를 함께 보낸다.
3. 웹 브라우저 내에는 쿠키 저장소가 있는데, 그 저장소에 Set-Cookie 헤더를 통해 받은 쿠키를 저장한다.
4. 브라우저는 이후에 서버에 다시 요청할 때, 쿠키 저장소에서 쿠키를 조회 후 Cookie헤더를 통해 함께 보낸다.
하지만 쿠키도 생명주기가 있다.
- 세션쿠키: 만료 날짜를 생략하면 브라우저 종료까지만 유지
- 영속 쿠키: 만료 날짜를 입력하면 입력한 날짜까지 유지
이다.
쿠키의 단점이 있다면 바로 보안에 취약하다는 점이다.
Cookie 보안
cookie는 보안 취약한데, 그 이유는 자바스크립트로 쿠키에 접근할 수 있다는 점을 이용한 XSS 공격과 HTTP 패킷
자체를 하이재킹 하여 쿠키를 탈취당할 위험도 있다.
이를 막기 위해 어떤 점이 있을까 3가지만 알아보겠다.
httpOnly
httpOnly 옵션은 자바스크립트로 브라우저의 쿠키에 접근하는 것을 막기 위한 옵션이다.
자바스크립트의 document.cookie를 사용하면 손쉽게 쿠키에 접근할 수 있는데, 그것을 방지하기 위해
쿠키의 접근은 http통신으로만 할 수 있게 하는 옵션이다.
secure
secure 옵션은 HTTP 패킷을 하이재킹 당해 쿠키를 탈취당할 수 있는 경우를 막는 옵션으로
해당 옵션을 설정 시 HTTPS통신을 할 때만 쿠키를 사용할 수 있게 된다.
sameSite
쿠키를 발급한 도인과 같은 도메인인지 여부를 확인 후 쿠키 전송을 제한한다.
쿠키를 발급한 도메인이 아닌 외부의 도메인에서는 해당 쿠키에 접근할 수 없다.
마치며
쿠키에 대해 얕은 지식만 가지고 있었음에도 면접준비할 때 쿠키를 잘 알아보지 못한 게
조금 부끄러웠고 앞으로는 다른 것들도 더 깊게 알아봐야겠다.