1. Cookie
사용자의 웹 브라우저에 저장되는 정보로 사용자의 상태 혹은 세션을 유지하거나 사용자 경험을 개선하기 위해 사용된다.
로그인 성공시 응답
로그인 이후 요청
Set-Cookie
- Server에서 Client로 Cookie 전달(Response Header)
Cookie
- Client가 Cookie를 저장하고 HTTP 요청시 Server로 전달(Request Header)
Cookie의 생명주기
- 세션 Cookie
- 만료 날짜를 생략하면 브라우저 완전 종료시 까지만 유지된다.(
Default)
expires, max-age 가 생략된 경우
- 브라우저를 완전 종료 후 다시 페이지를 방문했을 때 다시 로그인을 해야한다.
- 영속 Cookie
- 만료 날짜를 입력하면 해당 날짜까지 유지한다.
expires=Sat, 11-Dec-2024 00:00:00 GMT;
max-age=3600 (second, 3600초는 한시간. 60 * 60)
- 0이 되거나 음수를 지정하면 쿠키가 삭제된다.
Cookie의 도메인
- 쿠키가 아무 사이트에서나 생기고 동작하면 안된다!
- 필요없는 값 전송, 트래픽 문제 등이 발생한다.
domain=spartacodingclub.kr
domain=spartacodingclub.kr를 지정하여 쿠키를 저장한다.
dev.spartacodingclub.kr와 같은 서브 도메인에서도 쿠키에 접근한다.
- domain을 생략하면 현재 문서 기준 도메인만 적용한다.
Cookie의 경로
- 1차적으로 도메인으로 필터링 후 Path가 적용된다.
- 일반적으로
path=/ 루트(전체)로 지정한다.
- 위 경로를 포함한 하위 경로 페이지만 쿠키에 접근한다.
path=/api 지정
path=/api/example 가능
path=/example 불가능
Cookie 보안
Secure
- 기본적으로 Cookie는 http, https 구분하지 않고 전송한다.
- Secure를 적용하면 https인 경우에만 전송한다. s = Secure
HttpOnly
- XSS(Cross-site Scripting) 공격을 방지한다.
- 악성 스크립트를 웹 페이지에 삽입하여 다른 사용자의 브라우저에서 실행되도록 하는 공격
- 자바스크립트에서 Cookie 접근을 못하도록 막는다.
- HTTP 요청시 사용한다.
SameSite
- 비교적 최신 기능이라 브라우저 지원여부를 확인 해야한다.
- CSRF(Cross-Site Request Forgery) 공격을 방지한다.
- 사용자가 의도하지 않은 상태에서 특정 요청을 서버에 전송하게 하여 사용자 계정에서 원치 않는 행동을 하게 만든다.
- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
Cookie 사용방법
- 한번 로그인에 성공하면 HTTP Response에 쿠키를 담아서 브라우저에 전달한다.
- 브라우저는 요청마다 Cookie를 함께 전송한다.
- 보안상의 문제로
name=원욱이 아닌 userId=1과 같은 index 정보를 저장한다.
- 요구사항에 맞추어 세션 Cookie를 사용할지 영속 Cookie를 사용할지 결정한다.
Cookie 문제점
Cookie는 보안에 취약하여 userId=1 형태의 방식으로 로그인을 구현하지 않는다.
- 쿠키 값은 임의로 변경할 수 있다.
- Client가 임의로 쿠키의 값을 변경하면 서버는 다른 유저로 인식한다.
- 브라우저 개발자도구(F12) → Application → Cookies → 값 수정 가능
- 실제로는 암호화되어 저장되어있는 Value들을 볼 수 있다!
- Cookie에 저장된 Data는 탈취되기 쉽다.
userId = 주민번호, userId = 인덱스 값
- 쿠키는 네트워크 전송 구간에서 탈취될 확률이 매우 높다.
- HTTPS를 사용하는 이유 중 하나에 속한다.
- 민감한 정보를 저장하면 안된다.
- 한번 탈취된 정보는 변경이 없다면 반영구적으로 사용할 수 있다.
보안 대처방법
- 쿠키에 중요한값을 저장하지 않는다.
- 사용자 별로 일반 유저나 해커들이 알아보지 못하는 값을 노출한다.
- 일반적으로 암호화된
Token을 쿠키에 저장한다.
- 서버에서 암호화된
Token과 사용자를 매핑해서 인식한다.
- Token은 서버에서 관리한다.
- 토큰은 해커가 임의의 값을 넣어도 동작하지 않도록 만들어야 한다.
- 해커가 토큰을 탈취해도 사용할 수 없도록 토큰 만료시간을 짧게 설정한다.
- 탈취가 의심되는 경우 해당 토큰을 강제로 만료시키면 된다.