앱은 왜 기기 정보를 수집할까? (호환성, 오류대응, 보안통제)

앱은 왜 기기 정보를 수집할까라는 질문은 개인정보와 보안에 대한 관심이 높아질수록 자주 제기됩니다. 많은 사용자가 앱을 설치하거나 실행할 때 기기 정보 접근 권한을 확인하지만, 그 목적과 구조를 정확히 이해하지 못한 채 동의하는 경우가 많습니다. 앱을 처음 설치할 때 뜨는 권한 요청 화면, 그냥 "허용" 누르신 적 있으시죠? 저도 그랬는데 어느 날 같은 앱인데 오래된 폰에서는 UI가 완전히 깨져서 나오는 걸 보고 나서야 궁금해졌습니다. 기기 정보를 수집한다는 게 도대체 어떤 의미인지, 단순한 추적인지 아니면 앱이 제대로 돌아가기 위한 필수 조건인지. 그 차이를 이해하면 권한 요청을 볼 때 훨씬 합리적인 판단을 내릴 수 있습니다. 기기 정보와 호환성: 앱이 내 폰 환경을 먼저 파악하는 이유 앱이 처음 실행될 때 가장 먼저 하는 일 중 하나가 기기 환경을 파악하는 겁니다. 운영체제 버전, 화면 해상도, 제조사 정보, 언어 설정 같은 것들이죠. 이걸 두고 "나를 감시하는 거 아니냐"고 보는 시각도 분명히 있습니다. 그런데 제가 직접 앱 개발 관련 커뮤니티를 들여다보면서 느낀 건, 이 정보들이 없으면 앱 자체가 정상 동작을 보장하기 어렵다는 점이었습니다. API 레벨(API Level)이라는 개념이 있습니다. 안드로이드 기준으로, 이는 운영체제 버전에 따라 앱이 사용할 수 있는 기능의 범위를 숫자로 표현한 것입니다. 예를 들어 특정 알림 기능이 API 레벨 26 이상에서만 동작한다면, 앱은 기기 정보를 읽어서 그 이하 버전에서는 아예 해당 기능을 비활성화하거나 다른 방식으로 대체합니다. 이걸 모르고 그냥 실행하면 앱이 강제 종료되거나 기능이 절반만 동작하는 상황이 생깁니다. 화면 해상도(Screen Resolution) 역시 마찬가지입니다. 화면 해상도란 가로와 세로 방향으로 표시할 수 있는 픽셀 수를 의미하며, 기기마다 천차만별입니다. 같은 앱이라도 해상도 정보 없이 고정 레이아웃으로만 구성하면 어떤 기기에서는 버튼이 ...

웹페이지는 열릴 때 어떤 순서로 로딩될까? (DOM 생성, 렌더링, 스크립트 실행)

웹페이지를 열었을 때 화면이 한 번에 뜨지 않고 요소들이 순서대로 나타나는 경험, 누구나 해봤을 겁니다. 글자는 보이는데 버튼이 한참 뒤에 반응하거나, 이미지가 하나씩 천천히 떠오르는 상황 말입니다. 이런 현상은 단순히 인터넷 속도 문제가 아니라, 브라우저가 정해진 로딩 순서를 따라 웹페이지를 처리하기 때문에 발생합니다. 저도 처음엔 그냥 "느린 사이트"라고만 생각했는데, 이 구조를 알고 나니 어디서 병목이 생기는지 보이기 시작했습니다.

DOM 생성

브라우저가 웹페이지를 열 때 가장 먼저 하는 일은 HTML 문서를 받아서 DOM(Document Object Model)이라는 구조를 만드는 겁니다. DOM이란 웹페이지의 뼈대를 나타내는 트리 구조로, 브라우저가 화면에 무엇을 표시할지 결정하는 기준이 됩니다. 쉽게 말해, HTML 태그들을 브라우저가 이해할 수 있는 형태로 변환하는 과정입니다.

이 단계에서 브라우저는 HTML을 위에서 아래로 읽으면서 각 요소를 메모리에 저장합니다. 예를 들어 <div>, <p>, <img> 같은 태그들이 순서대로 처리되는 거죠. 문제는 이 과정에서 자바스크립트 파일을 만나면 DOM 생성이 멈춘다는 점입니다. 스크립트가 DOM을 조작할 가능성이 있기 때문에, 브라우저는 일단 스크립트를 실행한 뒤에야 다음 단계로 넘어갑니다.

여러 사이트를 비교해본 결과, DOM 생성 단계에서 큰 용량의 외부 스크립트를 불러오는 사이트일수록 초기 화면이 늦게 뜨는 경우가 많았습니다. 특히 광고 스크립트가 많은 뉴스 사이트에서 이런 현상이 두드러졌습니다. 화면 구조 자체가 간단해도, 스크립트 처리 때문에 체감 속도가 느려지는 겁니다.

렌더링

DOM이 만들어지면 이제 CSS를 해석해서 CSSOM(CSS Object Model)을 생성합니다. CSSOM이란 웹페이지의 스타일 규칙을 담은 구조로, 각 요소가 어떤 색상, 크기, 위치로 표시될지 결정합니다. DOM과 CSSOM이 합쳐져서 렌더 트리(Render Tree)가 만들어지고, 이를 바탕으로 브라우저는 화면에 실제로 그릴 요소들을 계산합니다.

렌더링 과정은 크게 세 단계로 나뉩니다. 첫째, 레이아웃(Layout) 단계에서 각 요소의 정확한 위치와 크기를 계산합니다. 둘째, 페인트(Paint) 단계에서 실제로 픽셀을 색칠합니다. 셋째, 컴포지트(Composite) 단계에서 여러 레이어를 합쳐서 최종 화면을 완성합니다. 이 세 단계를 거쳐야 비로소 우리가 보는 화면이 나타나는 겁니다.

여기서 중요한 건 CSS가 렌더링을 막는 리소스(render-blocking resource)라는 점입니다. 브라우저는 CSS를 모두 받아서 CSSOM을 만들기 전까지 화면을 그리지 않습니다. 스타일 정보 없이 화면을 그렸다가 나중에 다시 그리면 사용자 경험이 나빠지기 때문입니다. CSS 파일이 큰 사이트를 열 때 한동안 하얀 화면만 보다가 갑자기 화면이 뜨는 경험을 자주 했는데, 이게 바로 CSS 로딩을 기다리는 시간이었던 겁니다(출처: Web.dev).

스크립트 실행

자바스크립트는 웹페이지에 동작을 부여하는 언어입니다. 버튼 클릭, 스크롤 이벤트, 데이터 요청 같은 모든 동적 기능이 자바스크립트로 구현됩니다. 문제는 자바스크립트가 DOM과 CSSOM을 모두 조작할 수 있기 때문에, 브라우저가 스크립트를 만나면 렌더링을 멈추고 스크립트를 먼저 실행한다는 점입니다.

일반적으로 알려진 대로 <script> 태그는 HTML 파일의 <head>나 <body> 어디에나 위치할 수 있지만, 위치에 따라 로딩 순서가 크게 달라집니다. <head>에 있으면 DOM 생성 전에 실행되고, <body> 끝에 있으면 DOM이 거의 완성된 뒤 실행됩니다. 최근엔 async나 defer 속성을 써서 스크립트를 비동기로 불러오는 방식도 많이 쓰입니다. async는 스크립트를 다운로드하자마자 바로 실행하고, defer는 DOM 생성이 끝난 뒤 실행합니다.

솔직히 웹페이지를 쓰면서 가장 답답했던 순간이 바로 이 부분입니다. 화면은 다 떴는데 버튼을 눌러도 반응이 없거나, 스크롤이 갑자기 멈추는 경험 말입니다. 이건 대부분 무거운 자바스크립트가 아직 실행 중이거나, 외부 라이브러리를 기다리고 있기 때문입니다. 특히 광고나 분석 스크립트가 많을수록 이런 현상이 심해집니다. 화면이 보인다고 해서 실제로 사용 가능한 상태는 아닌 거죠.

  1. DOM 생성: HTML을 읽어 문서 구조를 만듭니다.
  2. CSSOM 생성: CSS를 해석해 스타일 규칙을 정리합니다.
  3. 렌더 트리 구축: DOM과 CSSOM을 합쳐 화면에 그릴 요소를 결정합니다.
  4. 레이아웃 계산: 각 요소의 위치와 크기를 계산합니다.
  5. 페인트: 실제로 픽셀을 색칠합니다.
  6. 스크립트 실행: 자바스크립트가 동작 로직을 추가합니다.

리소스 요청과 병목

웹페이지에는 HTML, CSS, 자바스크립트 외에도 이미지, 폰트, 동영상 같은 리소스들이 포함됩니다. 브라우저는 이 리소스들을 병렬로 다운로드하지만, 모든 리소스가 똑같이 처리되는 건 아닙니다. CSS와 자바스크립트는 렌더링을 막지만, 이미지나 폰트는 뒤에서 조용히 로딩됩니다. 그래서 화면은 떴는데 이미지가 나중에 하나씩 뜨는 현상이 생기는 겁니다.

최근 브라우저들은 프리로드 스캐너(Preload Scanner)라는 기능을 씁니다. 이건 HTML을 빠르게 훑으면서 필요한 리소스를 미리 파악해서 다운로드를 시작하는 기술입니다. 덕분에 스크립트 실행 중에도 다른 리소스를 동시에 받을 수 있어서 전체 로딩 속도가 빨라집니다. 하지만 외부 도메인에서 리소스를 불러올 때는 DNS 조회, 연결 설정 같은 추가 시간이 들기 때문에 여전히 병목이 생길 수 있습니다.

경험상 가장 체감 속도에 영향을 준 건 외부 광고 스크립트였습니다. 광고 서버 응답이 느리면 그만큼 전체 페이지 로딩이 지연됩니다. 화면은 거의 다 떴는데 광고 영역만 빈 채로 한참 기다리는 경우가 많았는데, 이게 바로 외부 리소스 대기 시간 때문이었습니다. 이런 사이트는 새로고침을 여러 번 해도 소용없고, 그냥 기다리는 게 답이었습니다(출처: MDN Web Docs).

웹페이지 로딩은 단순히 파일을 다운로드하는 게 아니라, 정해진 순서에 따라 단계적으로 화면을 준비하는 과정입니다. DOM 생성부터 렌더링, 스크립트 실행까지 각 단계가 서로 영향을 주고받기 때문에, 어느 한 부분에서 지연이 생기면 전체 속도가 느려집니다. 이 구조를 이해한 뒤로 웹사이트를 볼 때 "이 사이트는 스크립트가 무거운가?" "외부 리소스가 많은가?" 같은 질문을 하게 됐습니다. 단순히 빠르다 느리다를 넘어서, 왜 느린지 구조적으로 파악할 수 있게 된 거죠. 만약 화면은 떴는데 조작이 안 된다면, 아직 스크립트 처리 중일 가능성이 높으니 조금 기다려보는 게 더 나을 수도 있습니다.

댓글

이 블로그의 인기 게시물

쿠키 삭제해도 괜찮을까? (로그인 유지, 사이트 설정, 브라우저 정리)

비밀번호 저장 기능은 믿어도 될까?(브라우저 보안, 자동 로그인, 암호화)

쿠키와 세션은 무엇이 다를까? (브라우저 저장, 서버 관리, 로그인 유지)