웹 SQL 지원 중단 및 삭제

Thomas Steiner
Thomas Steiner

사용자의 컴퓨터에 구조화된 방식으로 데이터를 저장할 수 있는 Web SQL Database API (내부적으로는 SQLite 데이터베이스 엔진을 기반으로 함)는 2009년 4월에 도입되었으며 2010년 11월에 폐기되었습니다. 이 기능은 Safari를 구동하는 WebKit에서 구현되고 Chrome을 구동하는 Blink 엔진에서 계속 활성 상태였지만, Firefox를 구동하는 Gecko는 이 기능을 구현하지 않았으며 2019년에 WebKit에서 이 기능을 삭제했습니다.

W3C (World Wide Web Consortium)는 웹 데이터베이스가 필요한 사용자에게 localStorage, sessionStorage 또는 IndexedDB와 같은 웹 스토리지 API 기술을 채택하도록 권장합니다. 이러한 기술은 키/값 저장소 및 구조화된 데이터와 관련된 강점을 보여주지만 강력한 쿼리 언어의 부재와 같은 약점도 가지고 있습니다. 사람들이 웹에서 SQL을 사용하려는 데에는 이유가 있습니다.

웹 SQL 지원 중단 및 삭제 단계

  • [ 완료] Chromium 97(2022년 1월 4일)에서 웹 SQL이 지원 중단되고 서드 파티 컨텍스트를 위해 삭제되었습니다.
  • [ 완료] Chromium 105(2022년 1월 4일)부터 안전하지 않은 컨텍스트의 웹 SQL 액세스가 지원 중단되었으며 Chrome DevTools Issue 패널에 경고 메시지가 표시되었습니다.

비보안 컨텍스트의 웹 SQL 지원이 중단된다는 경고가 표시된 Chrome DevTools 문제 패널

  • [ 완료] Chromium 110(2022년 1월 4일)부터 안전하지 않은 컨텍스트의 웹 SQL 액세스를 더 이상 사용할 수 없습니다. 이 기능을 계속 사용하기 위한 기업 정책Chromium 110(2022년 1월 4일)부터 Chromium 123(2022년 1월 4일)까지 제공됩니다.
  • [ 완료] 모든 컨텍스트의 웹 SQL 액세스가 Chromium 115(2022년 1월 4일)부터 지원 중단되며 Chrome DevTools Issue 패널에 경고 메시지가 표시됩니다.
  • [ 완료] 웹 SQL을 계속 사용할 수 있는 지원 중단 기능 트라이얼Chromium 117(2022년 1월 4일)부터 Chromium 123(2022년 1월 4일)까지 제공되었습니다. 지원 중단 트라이얼에 대한 자세한 내용은 오리진 트라이얼 시���하기를 참고하세요.
  • [ 완료] Chromium 119부터 모든 컨텍스트의 웹 SQL 액세스를 사용�� 수 ���습니다.

다음 단계

소개 부분에서 언급했듯이 localStorage, sessionStorage 또는 IndexedDB 표준과 같은 웹 스토리지 API 기술은 많은 경우에 좋은 대안이지만 모든 경우에 사용하는 것은 아닙니다.

스토리지를 웹 개발자에게 맡기는 이유

Wasm의 출현과 함께 SQL 또는 NoSQL 솔루션이 웹에 등장할 수 있게 되었습니다. 한 가지 예시는 DuckDB-Wasm이고 다른 하나는 absurd-sql입니다. 이러한 창작물을 토대로 Google에서는 개발자 커뮤니티가 브라우저 공급업체보다 더 빠르고 나은 새 스토리지 솔루션을 반복하고 만들 수 있다고 생각합니다.

웹 SQL만 삭제할 계획은 없습니다. 실제로 Google은 이 도구를 오픈소스 커뮤니티에서 유지관리하고 원하는 대로 업데이트할 수 있는 패키지로 제공되는 내용으로 대체했으며, 수정 사항과 새로운 기능을 브라우저에 직접 도입할 부담 없이 이 도구를 제공했습니다. Google의 목표는 개발자가 자신의 데이터베이스를 웹으로 가져올 수 있도록 하는 것입니다.

또한 이 예시가 오픈소스 데이터베이스의 새로운 생태계가 번성하는 데 도움이 되기를 바랍니다. 파일 시스템 액세스 핸들 출시는 최종적으로 맞춤 저장소 솔루션을 빌드할 수 있는 새로운 기본 요소를 제공합니다.

Web SQL이 지원 중단되는 이유

지속 가능성 및 보안 문제

웹 SQL 사양은 지속 가능하게 구현할 수 없으므로 혁신과 새로운 기능이 ��한됩니다. 표준의 마지막 버전에는 문자 그대로 '사용자 에이전트가 Sqlite 3.6.19에서 지원되는 SQL 언어를 구현해야 합니다'라고 명시되어 있습니다.

SQLite가 악의적인 SQL 문을 실행하도록 설계된 것은 아니지만, Web SQL을 구현하려면 브라우저에서 정확히 이 작업을 실행해야 합니다. 보안 및 안정성 수정사항을 계속 유지해야 하는 경우 Chromium에서 SQLite를 업데이트해야 합니다. 이는 SQLite 3.6.19와 똑같이 동작해야 하는 웹 SQL의 요구사항과 직접적으로 상충됩니다.

API 형태

웹 SQL은 사용 기간을 보여주는 API이기도 합니다. 다음 코드 샘플(Nolan Lawson)에서 보여준 것처럼 2000년대 후반의 자식인 '콜백 헬'의 좋은 예입니다. 여기서 볼 수 있듯이 SQL 문 (SQLite SQL 언어 사용)은 데이터베이스 메서드에 문자열로 전달됩니다.

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

이 코드를 실행하고 Chrome DevTools로 생성된 테이블을 검사하면 결과는 다음과 같습니다.

Chrome DevTools의 웹 SQL 섹션을 살펴보면 '폭풍우'라는 테이블이 있는 mydatabase라는 데이터베이스가 표시되며, 여기에는 우울한 분위기와 심각도가 6인 열 분위기 (텍스트) 및 심각도 (정수)가 포함되어 있습니다.

구현자 지원 부족

적어도 오늘날의 관점에서 볼 때 Mozilla는 Arcane API의 형태 외에도 SQLite를 기반으로 빌드되는 웹 SQL에 대해 많은 우려를 가지고 있습니다.

"[SQLite] 가 일반적인 웹 콘텐츠에 노출되는 API의 올바른 기반이라고 생각하지 않습니다. 유용한 방식으로 SQL의 하위 집합을 만드는 신뢰할 수 있고 널리 수용되는 표준이 없기 때문입니다. 또한 SQLite 변경사항이 나중에 웹에 영향을 미치지 않도록 하고 주요 브라우저 버전 (및 웹 표준)을 SQLite에 활용하는 것이 적절하다고 생각하지 않습니다."

Mozilla의 우려사항에 대한 자세한 내용은 이전 Mozillan Vladimir Vukirchevirch의 블로그 게시물을 참조하세요. 자세한 내용은 W3C 웹 애플리케이션 작업 그룹 회의 시간을 확인하세요. 자세히 알아보려면 IRC 로그메일링 리스트 자료실을 참조하세요. 또한 Nolan Lawson의 블로그 게시물에도 발생한 상황에 대한 간략한 개요가 나와 있습니다.

의견

이 게시물에서 설명한 지원 중단 단계에 관해 우려되는 점이 있는 경우 blink-dev 메일링 리스트를 통해 알려주세요. 이 그룹의 회원은 누구든지 가입할 수 있으며 누구나 게시물을 올릴 수 있습니다.

감사의 말씀

이 도움말은 Joe Medley, Ben Morss, Joshua Bell이 검토했습니다.