웹 SQL 지원 중단 및 삭제

사용자의 컴퓨터에 구조화된 방식으로 데이터를 저장할 수 있는 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이 검토했습니다.