study/보안

저장소 비교

dddzr 2024. 12. 1. 01:07

토큰 저장을 위해 각 저장소를 비교해보았습니다.

저장소 종류

  • 서버 측 저장소:  세션(Session), 정적 변수(Static Variable), 데이터베이스(Database), 메모리 캐시(Memory Cache), 
  • 클라이언트 측 저장소(브라우저에 저장): 쿠키(Cookie), 세션 스토리지 (Session Storage), 자바스크립트 Static 변수
저장소 장점 단점 사례
세션 (Session) - 웹 애플리케이션에서 클라이언트 상태 유지
- 각 클라이언트마다 별도의 세션 관리
- 서버 메모리 사용량 증가
- 세션 만료 시 정보 소실
인증 정보, 사용자 설정
정적 변수 (Static Variable) - 여러 인스턴스 간 데이터 공유 가능
- 빠른 접근 속도
- 멀티스레딩 환경에서 데이터 경쟁 문제 발생 가능
- 애플리케이션 재시작 시 정보 소실
설정 값, API 키, 애플리케이션 전역 데이터
데이터베이스 (Database) - 영구적 저장 가능
- 데이터 백업 및 복원 용이
- 성능 저하 (I/O 오버헤드)
- 복잡한 쿼리 필요 시 개발 부담
사용자 정보, 액세스 로그
메모리 캐시 (Memory Cache) - 빠른 데이터 접근 속도
- TTL 설정으로 만료 관리 가능
- 서버 재시작 시 데이터 소실 가능
- 메모리 사용량 관리 필요
세션 정보, 자주 사용하는 데이터 캐시
쿠키 (Cookie) - 클라이언트 측에서 저장되어 브라우저 재시작 후에도 유지
- 서버에 부하를 주지 않음
- 보안 취약점 (XSS 공격 등)
- 크기 제한 (일반적으로 4KB)
사용자 인증 토큰, 사용자 설정
세션 스토리지 (Session Storage) - 클라이언트 측에서 빠른 데이터 접근 가능
- 탭 간 데이터 독립성 유지
- 브라우저가 닫히면 데이터 소실
- 보안 취약점 (XSS 공격 등)
일시적인 사용자 입력값, UI 상태 유지
클라이언트 측 Static 변수 - 빠른 데이터 접근 가능
- 다중 탭/브라우저 독립성
- 여러 모듈 간 데이터 공유 가능
- XSS 공격에 취약할 수 있음
- 브라우저 세션과 함께 초기화될 수 있음
API 기본 URL, 애플리케이션 설정 값
로컬 스토리지 (Local Storage) - 브라우저 종료 후에도 데이터 유지
- 모든 탭에서 동일한 데이터 공유
- 보안 취약점 (XSS 공격 등)
- 크기 제한 (일반적으로 5MB)
사용자 설정, 캐시 데이터
 
 

상세 설명

1. 세션 (Session)

  • 주로 웹 애플리케이션에서 사용자 인증 및 상태 유지를 위해 사용됩니다.
  • 서버 메모리에 저장되며, 사용자별로 구분된 정보를 유지할 수 있습니다. 하지만 서버가 재시작되면 세션 데이터가 소실될 수 있습니다.
  • *CSRF공격에 노출 될 수 있습니다.
  • 웹 기반 환경에서만 작동, 웹 서버가 클라이언트의 요청을 처리하는 동안에만 유지됩니다.
  • 서버는 각 클라이언트에 대해 고유한 세션을 생성하고 관리하기 때문에, 이는 여러 클라이언트의 상태를 관리하는 데 유용합니다.
  • 웹 애플리케이션에서 사용자 인증 정보, 사용자 설정, 장바구니 정보 등을 저장하는 데 일반적으로 사용됩니다.

2. 정적 변수 (Static Variable)

  • Java 애플리케이션에서 사용되는 전역적인 변수로, 데이터 공유가 필요할 때 유용합니다.
  • 단일 JVM에서만 작동하며, 멀티스레딩 환경에서 동시 접근에 대한 주의가 필요합니다.
  • 서버가 재시작되면 정적 변수에 저장된 데이터는 초기화되어 소실될 수 있습니다.
  • 애플리케이션에서 공통적으로 사용되는 데이터나 설정 값을 저장하는 데 유용합니다. 예를 들어, 액세스 토큰, API 키 등과 같은 데이터가 될 수 있습니다.
  • 도메인이 여러 개 일 때는 배열 형태에 (key, value)로 관리 할 수 있습니다.

3. 데이터베이스 (Database)

  • 영구적으로 데이터를 저장하고 관리할 수 있는 위치입니다.
  • 데이터의 무결성과 일관성을 보장할 수 있지만, 성능이 저하될 수 있습니다.

4. 메모리 캐시 (Memory Cache)

  • Redis, Memcached와 같은 인메모리 데이터 저장소를 사용하여 빠르게 데이터를 접근할 수 있습니다.
  • 데이터의 만료 시간을 설정할 수 있어, 자주 사용되는 데이터에 대해 효율적인 저장 방법입니다.
  • 서버 재시작 시 데이터 소실. ( RDB(완전 스냅샷)와 AOF(추적 로그), 클러스터링, 복제, 정기적인 백업 등 복구 방식 존재)

5. 쿠키 (Cookie)

  • 클라이언트의 브라우저에 저장되는 작은 데이터 조각입니다.
  • *CSRF, *XSS 공격에 취약합니다. (XSS ->HTTP Only Cookie를 사용하면 Client에서 Javascript를 통한 쿠키 탈취문제를 예방, Secure 접미사를 사용해서 쿠키를 생성하게 되면 브라우저는 HTTPS에서만 쿠키를 전송.)
  • 크기 제한도 있으므로 저장할 수 있는 데이터 양이 제한적입니다.
  • 만료 날짜 설정 가능. 브라우저 종료시에도 남아있는 장기적인 정보. (만료 날짜 지정 안 하면 브라우저 종료시 삭제)
  • 사용자의 로그인 상태나 사용자 설정을 유지.

6. 세션 스토리지(Session Storage)

  • 클라이언트 측에서 데이터를 저장하는 방법으로, 웹 브라우저에 세션 단위로 데이터를 저장합니다.
  • 각 탭/창이 독립적인 세션 스토리지를 가지고 탭/창이 열려 있는 동안 유지됩니다.
  • *XSS공격에 취약합니다.
  • 일시적인 데이터. 사용자 입력값 (폼 데이터), 동적 UI 상태 유지 (탭의 현재 상태, 선택된 항목 등), 애플리케이션 상태 정보 (필터링된 데이터, 검색어 등)

7. 로컬 스토리지 (Local Storage)

  • 클라이언트 측에서 데이터를 영구적으로 저장하는 방법으로, 웹 브라우저에 데이터를 저장합니다. 명시적으로 삭제할 때 까지 유지됩니다.
  • 브라우저 종료 후에도 유지됩니다. 모든 탭과 창에서 동일한 데이터를 공유합니다.
  • *XSS공격에 취약합니다.
  • 영구적인 데이터. 사용자 설정 (테마, 언어), 애플리케이션 캐시 데이터 (장바구니 내용, 사용자 선호 사항), 비밀번호나 사용자 이름과 같은 비민감 정보 등이 있습니다.

8.클라이언트 측 Static 변수

  • 클라이언트 애플리케이션 내에서 사용되는 전역 변수로, 여러 모듈 간에 데이터 공유가 필요할 때 유용합니다.
  • 각 사용자의 클라이언트 환경에서 관리되며, 빠른 접근 속도를 제공합니다.
  • 여러 탭이나 브라우저 인스턴스에서 별도의 값을 유지합니다.
  • XSS 공격에 취약할 수 있으며, 애플리케이션이 새로 고침되거나 종료될 경우 데이터가 초기화되어 소실됩니다.
  • *XSS(Cross-site scripting): 클라이언트 브라우저에 JavaScript 를 삽입해 실행하는 공격

*XSS(Cross-site scripting): 클라이언트 브라우저에 JavaScript 를 삽입해 실행하는 공격

-> 공격자의 코드가 내 사이트의 로직인 척 행동할 수 있다.

-> 입력 값 검증, *csp 설정 등 보안이 있습니다.

 

*Content Security Policy (CSP): CSP를 설정하여 스크립트가 특정 출처에서만 로드되도록 제한

 

*CSRF(Cross Site Request Forgery): 다른 사이트에서 우리 사이트의 api 콜을 요청해 실행하는 공격

-> 로그인한 척 계좌 비밀번호를 바꾸거나 송금을 보낸다.

CSRF 토큰을 사용하여 정상적인 출처에서 오는 것인지 확인.

 

'study > 보안' 카테고리의 다른 글

Access Token/Refresh Token 저장 위치  (0) 2024.12.01
방화벽/IDS/IPS  (0) 2024.03.12
CNAPP (CWPP/SCPM/CIEM)  (0) 2024.03.12