토큰 저장을 위해 각 저장소를 비교해보았습니다.
저장소 종류
- 서버 측 저장소: 세션(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 |