[Node.js] 쿠키의 한계

2023. 8. 10. 22:04공부 중/Node.js

 

1. 인증 부분의 한계

 

민감한 정보를 클라이언트 쪽에 저장한다는 것은 위험하다.

 

또한 쿠키는 쉽게 탈취당할 수 있기 때문에 민감한 정보를 저장하는 것에 어울리지 않는다.

 

그렇기 때문에 요즘에는 인증을 구현하기 위해서 쿠키보다는 세션이나 JWT를 사용한다.

 

그중에서 세션을 사용하면 서버 측에서 사용자에 대한 정보를 안전하게 저장하고, 클라이언트에는 세션 ID만을 저장하여 보다 안전하다.

 

그 외에도 세션은

  • 서버의 제어: 서버는 세션을 통해 사용자 데이터를 관리하고 특정 사용자에 대한 정보를 추적할 수 있습니다. 이를 통해 사용자별로 개인화된 경험을 제공할 수 있습니다.
  • 유연성: 세션은 여러 가지 데이터 타입과 복잡한 데이터 구조를 저장할 수 있습니다. 이를 통해 다양한 기능을 구현할 수 있습니다.
  • 만료 시간 설정: 세션에는 유효 시간이 있어, 설정된 시간 동안 사용자가 활동이 없으면 자동으로 만료됩니다. 이를 통해 보안을 강화할 수 있습니다.
  • 리소스 최적화: 사용자가 로그아웃하거나 세션이 만료되면, 해당 세션에 관련된 리소스는 해제될 수 있습니다. 이를 통해 서버의 리소스 사용을 최적화할 수 있습니다.

 

…와 같은 장점들로 인해 많은 웹 애플리케이션에서 세션 기반 인증 방식이 널리 사용되고 있다.

 

다음 기회에 더욱 안전하게 인증 기능을 구현하기 위해서 세션을 이용해 볼 것이다.

 


2. 저장 부분의 한계

 

오늘날에는 쿠키를 제외하고도 많은 방법으로 브라우저에 정보를 저장할 수 있다.

 

쿠키는 4KB라는 용량의 한계와 도메인 하나당 저장할 수 있는 쿠키의 개수는 20여 개 정도로 한정된다는 한계가 있다. (구체적인 개수는 브라우저에 따라 조금씩 다를 수 있습니다.)

 

실제로 브라우저의 개발자 도구를 살펴보면 쿠키 외에도 다양한 수단을 제공하는 것을 알 수 있다.

 

브라우저의 개발자 도구

 

가) localStorage

 

localStorage에 대한 tmi

  1. 대부분의 브라우저에서 localStorage의 저장되는 하나의 정보는 약 5MB의 용량 제한이 있다. (전체 localStorage는 용량 제한이 없다.)
  2. 쿠키와 다르게 웹 스토리지 객체는 네트워크 요청 시 서버로 전송되지 않는다. (서버와 데이터를 교환해야 하는 경우, AJAX나 Fetch API와 같은 기술을 사용하여 서버와 직접 통신)
  3. localStorage 데이터는 사용자가 직접 삭제하거나 웹 사이트에서 삭제하지 않는 한 영구적으로 남아 있다.
  4. localStorage는 키-값 쌍(key-value pairs)으로 데이터를 저장하는 간단한 API를 제공한다.
  5. localStorage의 동작은 동기적이다. 이는 긴 작업에 대해서는 UI가 멈출 수 있음을 의미함.
  6. localStorage에 저장되는 모든 값은 문자열로 변환된다. 복잡한 데이터 구조를 저장하려면, 예를 들어 JSON으로 변환하여 저장해야 한다.
  7. 개발자는 브라우저 내 웹 스토리지 구성 방식을 설정할 수 있다.
  8. 쿠키와 또 다른 점은 서버가 HTTP 헤더를 통해 스토리지 객체를 조작할 수 없다. 웹 스토리지 객체 조작은 모두 자바스크립트 내에서 수행된다.
  9. 웹 스토리지 객체는 도메인·프로토콜·포트로 정의되는 오리진(origin)에 묶여있다. 따라서 프로토콜과 서브 도메인이 다르면 데이터에 접근할 수 없다.

 

나) SessionStorage

 

SessionStorage 끼워 팔기.

 

이것은 localStorage와 매우 유사한 API를 제공하지만, sessionStorage의 데이터는 페이지 세션이 끝나면 즉, 브라우저 탭이 닫히면 삭제된다.

 

sessionStorage 객체는 localStorage에 비해 자주 사용되진 않는다.

 

그 이유는 sessionStorage는 현재 떠 있는 탭 내에서만 유지된다.

→ 같은 페이지라도 다른 탭에 있으면 다른 곳에 저장되기 때문입니다.

→ 그런데 하나의 탭에 여러 개의 iframe이 있는 경우엔 동일한 오리진에서 왔다고 취급되기 때문에 sessionStorage가 공유됨.

→ 페이지를 새로 고칠 때 sessionStorage에 저장된 데이터는 사라지지 않음.

→ 하지만 탭을 닫고 새로 열 때는 사라짐.

 

…등등 제공하는 프로퍼티와 메서드는 같지만, 고려해야 할 것이 많기 때문.

 

 

다) IndexedDB

 

IndexedDB에 관한 tmi

  1. IndexedDB는 키-값 저장소뿐만 아니라, 복잡한 데이터 구조와 큰 데이터 세트를 저장할 수 있는 객체 기반의 데이터베이스다.
  2. 대체로 localStorage보다 더 큰 저장 용량을 제공한다. 수백MB 또는 그 이상을 저장할 수도 있다.
  3. IndexedDB는 비동기식 API를 사용하여, 비동기적으로 작업을 수행한다.
  4. 다양한 데이터 타입, 포함하여 Blob과 같은 바이너리 데이터도 저장할 수 있다.
  5. 데이터베이스 작업에 대해 트랜잭션을 지원하므로, 여러 조작이 원자적(atomic)으로 수행될 수 있다.
  6. 데이터에 대한 빠른 검색을 위해 인덱싱 기능을 지원.

 

localStorage, SessionStorage이 요청 시 서버로 정보를 보내진 않기 때문에 서버와의 간단한 정보 전달을 위해서는 여전히 쿠키를 사용해야겠다. (물론 서버와 데이터를 교환해야 하는 경우, AJAX나 Fetch API와 같은 기술을 사용하여 서버와 직접 통신할 수 있음.)

 

간단한 데이터 저장 요구 사항이 있는 경우 localStorage, SessionStorage를 사용하고, 복잡하거나 큰 데이터에 대한 요구 사항이 있는 경우 IndexedDB를 사용하는 것이 좋겠다.

 

라) 자세한 사용법

  • LocalStorage, SessionStorage

 

 

localStorage와 sessionStorage

 

ko.javascript.info

  • IndexedDB

 

 

IndexedDB

 

ko.javascript.info

필요할 때 천천히 살펴보면 할 수 있다.

 


3. 암호화

 

추가적으로 쿠키는 사용자의 민감한 정보를 암호화하지 않고 저장하면 큰일 난다.

 

그렇기 때문에 여러 방법을 중첩으로 사용해서 쿠키의 정보를 보호해야 한다.

 

이때 사용할 수 있는 대표적인 기술은 hash, salt, key stretching이다.

 

  1. 해시 (Hash):
    • 해시는 데이터(예: 패스워드)를 고정 길이의 문자열로 변환하는 함수입니다.
    • 주로 패스워드를 직접 저장하지 않고, 그 해시 값을 저장하여 보안성을 높이는 데 사용됩니다.
    • 좋은 해시 함수는 원래의 데이터를 복원할 수 없도록 단방향성을 가져야 하며, 동일한 입력에 대해서는 항상 동일한 출력을, 다른 입력에 대해서는 가능한 서로 다른 출력을 생성해야 합니다.
  2. 솔트 (Salt):
    • 솔트는 무작위로 생성된 데이터 조각입니다.
    • 사용자의 패스워드에 솔트를 추가(보통 접두어나 접미어로 추가)하고 나서 해싱하는 것은 두 가지 주요한 이유 때문에 중요합니다:
      1. 같은 패스워드를 사용하는 사용자들이 있더라도 각기 다른 해시 값을 갖도록 합니다.
      2. 무차별 대입 공격(brute-force attacks)과 레인보우 테이블(rainbow table attacks)에 대한 저항성을 증가시킵니다.
    • 솔트는 보통 개방적으로 저장될 수 있으며, 패스워드 검증 시 솔트를 다시 사용하여 입력된 패스워드를 해싱하고 저장된 해시 값과 비교합니다.
  3. 키 스트레칭 (Key Stretching):
    • 키 스트레칭은 주어진 입력(예: 패스워드)에 대한 해시 함수를 여러 번 반복적으로 적용하는 기법입니다.
    • 이러한 반복은 공격자가 무차별 대입 공격을 시도할 때 필요한 시간을 크게 늘려, 공격의 효과를 크게 감소시키는 데 목적이 있습니다.
    • PBKDF2, bcrypt, scrypt 등이 키 스트레칭을 사용하는 대표적인 알고리즘입니다. 이들은 패스워드를 해시하는 데 특정 반복 횟수만큼 해시 함수를 적용합니다.

 

이러한 기법들을 함께 사용함으로써 패스워드와 같은 민감한 정보의 보안을 크게 향상할 수 있다.

 

 

 

  • bcrypt 사용법
 

bcrypt

A bcrypt library for NodeJS.. Latest version: 5.1.0, last published: 10 months ago. Start using bcrypt in your project by running `npm i bcrypt`. There are 4062 other projects in the npm registry using bcrypt.

www.npmjs.com

 

읽어보고 할 것.

 


'공부 중 > Node.js' 카테고리의 다른 글

[Express] Session으로 인증 구현하기_1  (0) 2023.08.22
[Express] Session이란?  (0) 2023.08.19
[Express] 쿠키로 다크모드 구현  (1) 2023.08.08
[Node.js] 쿠키 옵션  (0) 2023.07.07
[Node.js] 세션 쿠키, 영구 쿠키  (0) 2023.07.06