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

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

앱 로그인 상태는 어떻게 유지될까? (인증 흐름, 세션·토큰, 보안 설계)

앱 로그인 상태는 어떻게 유지될까요? 저는 앱을 껐다 켜도 로그인이 유지되는 게 당연하다고 생각했습니다. 그런데 어느 날 로그인이 풀려버린 경험을 하고 나서야 '이게 도대체 어떻게 작동하는 거지?'라는 의문이 생겼습니다. 알고 보니 이건 단순히 앱이 비밀번호를 기억해두는 구조가 아니었습니다. 보안과 편의성 사이에서 꽤 정교하게 설계된 인증 흐름이 그 뒤에 있었습니다.

로그인하면 내부에서 무슨 일이 벌어지는가 — 인증 흐름

처음 이 구조를 들여다봤을 때 솔직히 예상 밖이었습니다. 저는 앱이 어딘가에 아이디와 비밀번호를 저장해두고, 요청할 때마다 꺼내 쓰는 방식이라고 막연히 생각했거든요. 실제로는 전혀 다릅니다.

사용자가 아이디와 비밀번호를 입력하면, 앱은 이를 서버로 전송합니다. 서버는 정보가 맞는지 확인한 뒤 인증이 성공하면 별도의 값을 하나 발급합니다. 이후에는 이 값만 가지고 "저 이미 인증된 사람입니다"를 증명하는 구조입니다. 실제 비밀번호는 이 시점 이후로 다시 쓰이지 않습니다.

이때 발급되는 값이 바로 인증 토큰(Authentication Token)입니다. 인증 토큰이란 사용자의 신원을 대신 증명하는 임시 자격증 같은 것으로, 유효 시간이 정해져 있고 만료되면 자동으로 효력을 잃습니다. 매번 비밀번호를 서버로 보내지 않아도 되니 보안상 훨씬 유리하고, 서버도 이 토큰의 유효 여부를 언제든지 통제할 수 있습니다.

현재 많은 앱에서 사용하는 방식은 JWT(JSON Web Token)입니다. JWT란 인증 정보를 JSON 형태로 담아 암호화한 토큰으로, 서버가 별도로 상태를 저장하지 않아도 토큰 자체만으로 사용자를 식별할 수 있도록 설계된 구조입니다. 실무에서 꽤 넓게 쓰이는 방식이라, 개발을 조금이라도 들여다본 분이라면 한 번쯤은 들어보셨을 겁니다. JWT 공식 소개(jwt.io)에 구조에 대한 설명이 잘 정리되어 있습니다.

세션과 토큰, 뭐가 다른가 — 세션·토큰 비교

로그인 상태를 유지하는 방식은 크게 두 가지로 나뉩니다. 세션(Session) 방식과 토큰(Token) 방식입니다. 제가 처음에 헷갈렸던 부분이기도 합니다.

세션(Session)이란 서버가 로그인 상태를 직접 기록하고 관리하는 방식입니다. 사용자가 로그인하면 서버 안에 세션 정보가 생성되고, 앱은 그 세션을 가리키는 ID만 받아서 씁니다. 구조가 단순하고 서버에서 즉시 세션을 삭제하면 로그아웃 처리도 명확합니다. 다만 사용자가 늘어날수록 서버가 기억해야 할 세션도 그만큼 쌓이기 때문에, 대규모 서비스에서는 부하가 걸릴 수 있습니다.

반면 토큰 방식은 인증 정보를 서버가 아닌 사용자 측에 저장합니다. 앱은 토큰을 로컬에 보관하고 있다가, 요청할 때마다 서버에 함께 전달합니다. 서버는 토큰이 유효한지만 확인하면 됩니다. 서버 입장에서는 상태를 기억할 필요가 없으니 확장성이 높고 부담이 적습니다.

두 방식을 간단히 정리하면 이렇습니다.

  1. 세션 방식: 서버가 로그인 상태를 기억. 보안 통제가 쉽지만 서버 자원 소모가 큼
  2. 토큰 방식: 사용자 기기에 인증 정보 저장. 확장성이 뛰어나지만 토큰 유출 시 위험이 큼
  3. 리프레시 토큰(Refresh Token) 구조: 단기 토큰이 만료되면 장기 토큰으로 재발급. 두 방식의 단점을 보완

리프레시 토큰(Refresh Token)이란 짧은 유효 시간의 액세스 토큰이 만료됐을 때, 사용자가 다시 로그인하지 않아도 새 토큰을 발급받을 수 있도록 해주는 장기 인증 수단입니다. 제가 직접 여러 앱을 써보면서 느낀 건, 이 구조가 잘 설계된 앱일수록 사용자는 로그인이 풀리는 순간을 거의 경험하지 못한다는 겁니다. 배경에서 조용히 토큰이 갱신되고 있기 때문입니다.

OWASP(오픈 웹 애플리케이션 보안 프로젝트)는 토큰 기반 인증을 구현할 때 반드시 만료 시간 설정과 토큰 저장 위치에 대한 보안 검토를 병행해야 한다고 권고합니다. (출처: OWASP JWT 보안 가이드)

로그인이 갑자기 풀리는 이유 — 보안 설계의 관점으로

저도 처음 로그인이 갑자기 풀렸을 때 앱 오류라고 생각했습니다. 그런데 알고 보면 이건 오류가 아니라 의도된 동작인 경우가 대부분입니다.

인증 토큰에는 반드시 만료 시간이 설정됩니다. 일정 시간 앱을 사용하지 않으면 토큰이 자동으로 만료되고, 재인증을 요구받게 됩니다. 이건 계정 탈취나 도용을 막기 위한 기본적인 보안 정책입니다. 편의성이 조금 낮아지더라도 놓쳐선 안 되는 부분입니다.

로그인이 풀리는 주요 상황을 꼽자면 이렇습니다.

  1. 장시간 앱 미사용으로 인한 토큰 만료
  2. 비밀번호 변경 후 기존 토큰 강제 무효화
  3. 다른 기기에서 새로 로그인하여 기존 세션 종료
  4. 앱 데이터 삭제 또는 기기 초기화로 로컬 저장 토큰 삭제
  5. 서버 측 보안 정책 업데이트로 인한 일괄 재인증 요청

제 경험상 가장 황당했던 건 앱 데이터를 청소하다가 로그인이 풀린 경우였습니다. 스토리지를 정리하겠다고 캐시를 날렸는데, 토큰이 로컬 저장소에 함께 보관돼 있었던 겁니다. 인증 정보가 기기 안에 파일처럼 저장된다는 걸 그때 처음 실감했습니다.

일반적으로 보안이 강한 앱일수록 토큰 유효 기간이 짧다고 알려져 있지만, 제 경험상 이건 좀 다릅니다. 잘 설계된 앱은 액세스 토큰은 짧게 유지하되 리프레시 토큰으로 자동 갱신하는 구조를 씁니다. 그래서 사용자는 보안이 강화된 줄도 모르고 자연스럽게 서비스를 쓰게 됩니다. 이 균형이 잘 잡혔는지 여부가 앱의 완성도를 은근히 드러낸다고 생각합니다.

로그인 유지 구조는 눈에 보이지 않지만 앱 경험 전체를 조용히 떠받치고 있는 부분입니다. 앱을 단순히 쓰는 입장에서도 이 구조를 알고 나면 로그인이 풀리거나 재인증을 요구받는 상황이 훨씬 자연스럽게 느껴집니다. 보안 설정이 민감한 서비스를 쓸 때는 자동 로그인 유지 기간이 어떻게 설정돼 있는지 한 번쯤 확인해보는 것도 좋습니다. 내 계정이 어떤 방식으로 보호받고 있는지 아는 것, 그게 시작입니다.

---참고--- 
JWT 공식 소개 — https://jwt.io/introduction OWASP JWT 
보안 가이드 — https://owasp.org/www-project-cheat-sheets/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html

관련 글

자동 로그인은 어떻게 가능한 걸까?

댓글

이 블로그의 인기 게시물

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

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

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