1. 쿠키 (Cookie)
쿠키는 사용자를 기억하기 위해 서버가 사용자의 브라우저에 저장하는 데이터(작은 기록 정보 파일)입니다.
* 쿠키 동작 원리
HTTP의 일종으로 사용자가 특정 웹 사이트를 방문할 경우,
1) 클라이언트가 페이지를 요청(request)하면 (사용자의 웹 사이트 접근)
2) 웹 서버는 쿠키를 생성하여 정보를 담아 클라이언트에게 응답(response)합니다.
3) 응답 받은 쿠키는 클라이언트 PC에 저장되며, 다시 서버에 요청 시 요청과 함께 쿠키를 전송합니다.
4) 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송합니다.
* 쿠키 특징
1) 이름, 값, 만료일, 경로 정보로 구성되어 있습니다..
2) 클라이언트는 총 300개의 쿠키를 저장할 수 있습니다.
3) 한 도메인 당 20개의 쿠키를 가질 수 있습니다.
4) 하나의 쿠키 당 4KB 까지 저장 가능합니다.
* 쿠키 단점
- (요청 시 쿠키 값을 그대로 전송하기 때문에 유출 및 조작 당할 위험이 존재하여) 보안에 취약합니다.
- 용량 제한이 있어 많은 정보를 담을 수 없습니다.
- 웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능합니다.
- 쿠키의 사이즈가 커질 수록 네트워크 부하가 심해집니다.
* 쿠키 사용 예시
- 사용자 관련 정보와 개인 선호도를 저장
1) 방문했던 사이트에 재방문 시 아이디와 비밀번호 자동 입력
2) 팝업 창을 통한 "오늘 이 창을 다시 보지 않기" 체크
2. 세션 (Session)
세션은 쿠키의 보안상 문제를 해결하기 위한 방법으로, 비밀번호 등 클라이언트의 민감한 인증 정보를 브라우저가 아닌 서버 측에 저장하고 관리합니다. 이를 통해 서버는 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 웹 브라우저 종료 시까지 일정하게 유지합니다.
* 세션 동작 원리
1) 유저가 웹사이트에서 로그인 시, 세션이 서버 메모리(혹은 데이터베이스)에 저장됩니다.
이때, 세션을 식별하기 위한 Session Id를 기준으로 정보를 저장합니다.
2) 서버에서 생성한 Session Id를 쿠키에 담아 브라우저에 전송합니다.
3) 쿠키에 정보가 담겨 있어 브라우저는 해당 사이트에 대한 모든 요청에 Session Id를 쿠키에 담아 전송합니다.
4) 서버는 클라이언트가 보낸 Session Id와 서버 메모리로 관리하고 있는 Session Id를 비교하여 인증을 수행합니다.
* 세션 특징
1) 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장합니다.
2) (브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제되므로) 쿠키보다 비교적 보안이 좋습니다.
3) 서버 용량이 허용하는 한 저장 데이터에 제한이 없습니다.
4) 각 클라이언트에 고유 Session ID를 부여합니다.
* 세션 단점
- 해커가 Session Id가 탈취 시, 클라이언트인 척 위장할 수 있다는 한계가 존재합니다.
- 로그인 요청이 대량으로 발생 시, 서버 부하가 심해집니다.
- 서버 다운 시 메모리의 휘발성으로 인해 모든 Session Id가 삭제될 수 있습니다.
하드디스크 혹은 데이터베이스를 사용한다면 해결되지만 그러면 메모리 방식보다 속도가 느려집니다.
- Redis와 Memcached를 통해 서버 확장에 대응할 수 있지만 여전히 서버가 상태를 기억해야 한다는 부담이 존재합니다.
* 세션 사용 예시
1) 화면이 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지
3. 토큰 (Token)
토큰 기반 인증 시스템은 클라이언트가 서버에 접속하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 토큰을 부여합니다. 이 토큰은 유일하며, 이를 발급받은 클라이언트는 서버에 다시 요청을 보낼 때 요청 헤더에 토큰을 담아 보냅니다. 그러면 서버는 클라이언트에서 보낸 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리합니다.
토큰 방식이 세션 방식과 다른 점은 세션 방식이 서버가 파일이나 데이터베이스에 세션 정보를 가지고 있어야 한다면, 토큰은 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 확연히 줄일 수 있습니다.
* 토큰 동작 원리
1) 사용자가 아이디와 비밀번호로 로그인 합니다.
2) 서버 측에서 사용자(클라이언트)에게 유일한 토큰을 발급합니다.
3) 클라이언트는 서버 측에서 전달 받은 토큰을 쿠키나 스토리지에 저장한 뒤, 서버에 요청할 때마다 해당 토큰을 HTTP 요청 헤더에 포함시켜 전달합니다.
4) 서버는 전달받은 토큰을 검증하고 요청에 응답합니다.
(토큰이 요청한 사람의 정보가 담고 있기 때문에 서버는 DB에 조회하지 않고도 누가 요청했는지 알 수 있습니다.)
* 토큰 특징
1) 인증 받은 사용자에게 유일한 토큰을 발급하고, 로그인이 필요한 작업의 경우 헤더에 토큰을 함께 보내 인증 받은 사용자인지 확인합니다.
2) 서버 기반 인증 시스템과 달리 상태를 유지하지 않으므로 Stateless한 특징을 갖고 있습니다.
* 토큰 단점
1) 쿠키/세션과 달리 토큰 자체의 데이터 길이가 길기 때문에 인증 요청이 많아질수록 네트워크 부하가 심해집니다.
2) Payload 자체는 암호화되지 않기 때문에 사용자의 중요한 정보를 담을 수 없습니다.
3) 토큰을 탈취당하면 대처하기 어렵습니다. (보통, 사용 기간 제한을 설정하여 극복합니다.)
* 토큰 사용 예시
- 보다 안전한 인증/인가 목적으로 주로 사용됨
1) 다양한 소셜 로그인에 사용
Q. 쿠키와 세션의 개념과 차이를 설명해보세요.
쿠키는 HTTP의 일종으로, 사용자가 특정 웹 사이트를 방문할 경우 사용자를 기억하기 위해 서버가 해당 브라우저에 저장하는 작은 기록 정보 파일입니다.
세션은 쿠키의 보안상 문제를 해결하기 위한 방법으로, 비밀번호 등 클라이언트의 민감한 인증 정보를 브라우저가 아닌 서버에 저장하고 관리합니다.
쿠키는 정보가 클라이언트의 PC에 text 형태로 저장되며, 쿠키 생성 시 저장된 만료일까지 유지됩니다. 따라서 브라우저가 종료되어도 만료일이 지나지 않으면 삭제되지 않습니다. 한 브라우저 당 300개, 한 도메인 당 20개의 쿠키를 저장할 수 있으며 각 쿠키의 크기는 최대 4 KB로 제한됩니다. 세션보다 빠르지만 세션에 비해선 보안에 취약합니다.
세션은 정보를 웹 서버에 Object 형태로 저장합니다. 브라우저 종료 시 바로 삭제되며, 서버가 허용하는 한 용량 제한이 없습니다. 쿠키보다 느리지만 쿠키에 비해 보안상 뛰어납니다.
Q. 세션 기반 인증 방식과 토큰 기반 인증 방식의 차이에 대해 설명해주세요.
세션 기반 인증 방식은 서버와 클라이언트 간 세션 아이디 하나만 오고 가기 때문에 전송되는 데이터의 양이 적으며, 사용자의 데이터를 서버에서 관리하기 때문에 토큰 방식보다 안전합니다. 하지만 사용자의 데이터를 서버 메모리에 저장하기 때문에 메모리 용량에 대한 리스크가 존재하며, 서버 확장 시 세션 동기화를 위해 추가 비용이 발생할 수 있습니다.
토큰 기반 인증 방식은 사용자의 인증을 토큰을 통해 관리하기 때문에 서버의 부담이 없고, 서버 확장에도 용이하여 다양한 소셜 로그인 방식으로 사용됩니다. 하지만 한번 발급된 토큰을 자체적으로 만료할 방법이 없어 토큰을 탈취 당할 시 대처할 수 없다는 위험이 존재합니다.
참고 출처:
'CS' 카테고리의 다른 글
[CS] HTTP와 HTTPS (0) | 2023.11.30 |
---|---|
[CS] JWT란 (0) | 2023.10.27 |