COOKIE, SESSION, TOKEN
1. COOKIE
- 만료기간이 있는 클라이언트 단에 저장하는 데이터 파일
- HTTP 헤더에 포함되는 텍스트 데이터 파일 이름, 만료기간, 도메인, 경로 정보와 key, value 값으로 구성
- 사용자 인증이 유효한 시간을 명시할 수 있고, 유효시간 내에 브라우저가 종료되어도 인증 유지
- 하나의 쿠키 값은 4KB 까지 저장
쿠키 종류
- 세션 쿠키 : 쿠키에 만료일이 포함되지 않으며, 램 메모리에만 저장되어 브라우저를 닫는 순간, 쿠키가 소멸
- 영구 쿠키 : 만료일이 포함되어 있어서 만료일까지는 브라우저를 종료하더라도 사용자의 컴퓨터에 저장되어 상태를 유지할 수 있으며, 만료 시기가 되면 자동으로 삭제
장점
- 대부분 브라우저가 지원
- 데이터 유효기간 지정 가능
- XSS(사이트 간 악성 js 코드를 심는 행위)로 부터 안전
- ⇒ 서버에서 쿠키의 HttpOnly 옵션을 설정하면 JS에서 쿠키에 접근 자체 불가능
단점
- 매주 작은 데이터 저장 용량
- 매번 서버에 HTTP 요청시 같이 전달
- 암호화가 되어 있지 않아 정보 도난 위험
- CSRF 위협 : 공격자가 사용자의 요청을 가로챈 뒤 사용자의 의지와 상관 없이 보안적으로 위험한 행동을 하도록 하여 부당 이익을 취하는 행위
2. SESSION
- 사용자가 웹 서버에 접속해 있는 상태를 하나의 단위(세션)을 서버 쪽에서 저장하고 관리하는 것
- 서버에서는 클라이언트를 구분하기 위해 유일한 값인 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지
- 클라이언트는 이 세션 ID를 쿠키를 통해 기억한 게 된다. 이후 클라이언트가 어떤 요청을 보낼 때마다 헤더의 쿠키에 세션 ID를 담아서 전송
- 서버는 클라이언트가 보낸 요청의 쿠키에 담긴 세션 ID와 세션 스토리지에 담긴 세션 ID를 대조해 인증 상태를 판단
(즉, 세션과 쿠키는 완전히 분리된 개념이 아니며 세션은 쿠키를 기반으로 한다)
단점
- 서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버에 부하가 심해짐
- 쿠키를 포함한 요청이 외부에 노출되거나 탈취되면 세션 ID 자체는 유의미한 개인정보를 담고 있지 않다고는 하지만 탈취자가 클라이언트 인척 위장할 수 있다
COOKIE vs SESSION
COOKIE, SESSION 기반 인증 방식
3. TOKEN
소프트웨어 또는 하드웨어에서의 어떤 작업을 수행할 수 있는 권한을 나타내는 객체
그중 가장 대표적인 것이 JWT (Json Web Token)
SON 객체를 사용하여 가벼운 방식으로 정보를 안전성 있게 전달해주기 위한 토큰
구조
- header(헤더) : JWT 인 토큰의 유형이나 HS256과 같이 사용되는 해시 알고리즘 중 무엇으로 사용했는지 등의 정보가 담기는 곳
{
"alg" : "HS256",
"typ" : "JWT"
}
alg : 해싱 알고리즘 지정
typ : 토큰 타입
- payload(내용) : 토큰에 담을 정보, 클라이언트에 대한 정보나 메타 데이터 정보
- 주의할 점은 jwt는 그 자체 내에 이렇게 정보를 담고 있기 때문에 탈취당했을 시를 대비해 payload에 비밀번호와 같이 민감한 개인정보를 담으면 안됨
- signature(서명) : 헤더에서 지정한 알고리즘과 secret 키, 서명으로 payload와 header를 담는다.