정말 오랜만에 블로그를 작성해본다.
인증/보안에 관해 공부를 다시 시작해보면서 풀스택으로 로그인 /로그아웃 기능을 구현해보기 위해 가장 첫번째로 쿠키에 대해 공부를 시작했다.
오늘 블로그 포스팅은 지난 부트캠프에서 대충(?) 공부하고 넘겼던 쿠키에 대한 포스팅이다.
왜 제목을 눅눅한 Cookie로 작성했나면 음 .. 뭐랄까 쿠키는 수식어로 바삭한 쿠키가 더 어울리지만 네트워크 용어인 쿠키는 데이터를 저장하는데 목적을 지니고 있기 때문에 쿠키를 저장한다 -> 오래 둔다 -> 눅눅해진다 -> 눅눅한 쿠키가 탄생했다 !! ㅎㅎㅎㅎ
이제 가벼운 수다는 멈추고 시작 !
쿠키란 ?
서버에서 클라이언트에 영속성 있는 데이터를 저장하는 방법
서버는 클라이언트의 쿠키를 이용하여 데이터를 가져올 수 있음.
그러므로 쿠키를 이용하는 것은 단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 다시 전송하는 것도 포함됨.
쿠키의 주요 특징
서버가 클라이언트에 특정한 데이터를 저장할 수 있음 .
앞서 언급한 것처럼 서버는 쿠키를 이용하여 데이터를 저장하고 이 데이터를 다시 불러와 사용할 수 있음.
하지만 데이터를 저장한 이후 특정 조건들을 만족해야 다시 쿠키를 가져올 수 있음
이러한 조건들은 HTTP 헤더를 사용해 쿠키 옵션으로 표현 가능함.
쿠키 옵션 종류
'Set-Cookie':[
'cookie=yummy',
'Secure=Secure; Secure',
'HttpOnly=HttpOnly; HttpOnly',
'Path=Path; Path=/cookie', -> path
'Doamin=Domain; Domain=manchoon.com' ->도메인
]
1. Domain
도메인은 www.google.com과 같은 서버에 접속할 수 있는 이름임.
쿠키 옵션에서 도메인은 포트 및 서브 도메인 정보, 세부 경로를 포함하지 않음.
(여기서 서브 도메인이란 www 같은 도메인 앞에 추가로 작성되는 부분)
따라서 요청해야 할 URL이 http://www.localhost.com:3000/users/login 이라 하면 여기에서 Domain은 localhost.com
만약 쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키를 전송할 수 있음. 이를 통해 서로 다른 도메인에서 받은 쿠키를 전송하는 일을 막을 수 있음 .
(naver.com에서 받은 쿠키를 google.com에 전송하는 일을 방지 할 수 있음)
2. Path
Path는 세부 경로로써 서버가 라우팅할 때 사용하는 경로를 의미
만약 요청해야 하는 URL이 http://www.localhost.com:3000/users/login인 경우라면 여기에서 Path는 /users/login임
이를 명시하지 않으면 기본적으로 /으로 설정되어 있음.
Path 옵션의 특징은 설정된 경로를 포함하는 하위 경로로 요청을 하더라도 쿠키를 서버에 전송할 수 있음.
즉 Path가 /users로 설정되어 있고, 요청하는 세부 경로가 /users/manchoon인 경우라면 쿠키 전송이 가능함.
하지만 /posts/manchoon로 전송되는 요청은 Path 옵션(/users)을 만족하지 못하기 때문에 서버로 쿠키를 전송할 수 없음.
3. MaxAge or Expires
쿠키가 유효한 기간을 정하는 옵션
(쿠키가 영원히 남아있다면 탈취도 쉬워지므로 유효기간을 설정하는 것이 보안 측면에서 중요함 )
MaxAge : 쿠키 유효 시간을 초 단위로 설정하는 옵션 (MaxAge 에서 설정한 시간이 경과한 후 브라우저에 의해 쿠키는 삭제됨 )
Expires : 쿠키가 만료되는 날짜와 시간을 지정하는 옵션 (만료 시간에 도달하면 브라우저에 의해 쿠키는 삭제됨 )
두 옵션의 여부에 따라 세션 쿠키 ( Session Cookie)와 영속성 쿠키 ( Persistent Cookie)로 나눠짐
세션 쿠키 : MaxAge , Expires 옵션이 없는 쿠키 , 브라우저가 실행 중일 때 사용할 수 있는 임시 쿠키 ( 브라우저를 종료하면 해당 쿠키는 삭제 됨 )
영속성 쿠키 : 브라우저의 종료 여부와 상관없이 MaxAge 또는 Expires에 지정된 유효시간만큼 사용가능한 쿠키
4. Secure
사용하는 프로토콜에 따른 쿠키의 전송 여부를 결정하는 옵션
Secure 옵션이 true로 설정된 경우 HTTPS를 이용하는 경우에만 쿠키를 전송할 수 있음.
Secure 옵션이 없다면 프로토콜에 상관없이 http, https 모두 쿠키를 전송할 수 있음
(단 도메인이 localhost 인 경우에는 https가 아니어도 쿠키 전송이 가능함 . 이는 개발 단계에서 localhost를 사용하는 경우가 많기 때문에 생긴 예외임 )
5. HttpOnly
자바스크립트로 브라우저의 쿠키에 접근이 가능한지 여부를 결정함.
해당 옵션이 true로 설정된 경우 자바스크립트로 쿠키에 접근이 불가함.
옵션을 명시하지 않은 경우에는 기본적으로 false로 지정됨. 이 옵션이 false인 경우 document.cookie를 이용해 자바스크립트로 쿠키에 접근 할 수 있으므로 쿠키가 탈취될 위험이 있음.
6. SameSite
Cross-Site요청을 받은 경우 , 요청에서 사용한 메서드와 해당 옵션의 조합을 기준으로 서버의 쿠키 전송 여부를 결정하게 됨.
Lax : Cross-Site 요청이라면 GET 메서드에 대해서만 쿠키를 전송할 수 있음
Strict : Cross-Site가 아닌 Same-Site인 경우에만 쿠키를 전송할 수 있음
None : Cross-Site여도 항상 쿠키를 보낼 수 있음 하지만 쿠키 옵션 중 Secure 옵션이 필요함
Cross-Origin : 서버의 도메인, 프로토콜, 포트 중 하나라도 다른 경우
Cross-Site : eTLD + 1 이 다른경우
(eTLD + 1 : 유효 최상위 도메인 바로 왼쪽의 하위 레벨 도메인을 합한 것 ex: naver.com)
서버에서 이러한 옵션을 지정한 후 서버에서 클라이언트로 쿠키를 처음 전송하게 된다면 헤더에 Set-Cookie라는 프로퍼티로 쿠키를 담아 전송함.
이후 클라이언트에서 서버에게 쿠키를 전송해야 한다면 클라이언트는 헤더에 Cookie라는 프로퍼티에 쿠키를 담아 서버에 쿠키를 전송하게 됨.
위에서 정리한 쿠키의 특성을 이용하여 서버는 클라이언트에 인증정보를 담은 쿠키를 전송하고, 클리이언트는 전달받은 쿠키를 서버에 요청과 함께 전송하여 Stateless한 인터넷 연결을 Stateful 하게 유지할 수 있음
하지만
기본적으로 쿠키는 오랜 시간동안 유지될 수 있고, HttpOnly옵션을 사용하지 않았다면 자바스크립트를 이용해서 쿠키에 접근할 수 있기 때문에 쿠키에 민감한 정보를 담는 것은 위험함.
다음 포스트에서는 쿠키를 활용하여 로그인 기능을 구현해 볼 것이다.
'네트워크' 카테고리의 다른 글
IP / IP Packet (0) | 2023.05.02 |
---|