본문 바로가기

전체 글

[Android] 앱은 서버 인증서를 어떻게 믿을까? 앱에서 https://로 시작하는 주소로 통신하면, 우리는 별생각 없이 "암호화됐으니 안전하겠지"라고 넘어갑니다. 그런데 앱은 지금 통신하는 상대가 진짜 우리 서버인지 어떻게 알까요? 😗누군가 중간에서 가짜 서버를 세워두고 우리 서버인 척한다면요? 이번 글에서는 HTTPS가 상대를 믿는 방식, 그리고 인증서 피닝을 정리해보려 합니다. 🤔 HTTPS는 그냥 암호화가 아니다HTTPS를 흔히 "통신을 암호화하는 것"으로만 알고 있는데 사실 암호화는 절반입니다.나머지 절반은 상대가 진짜인지 확인하는 것(인증)입니다.아무리 암호화를 잘해도, 암호화된 내용을 가짜 서버에게 고스란히 보내버리면 의미가 없으니까요. 그래서 TLS 연결은 본격적인 통신 전에 핸드셰이크 단계를 거칩니다.이때 서버는 자신의 인증서(cer.. 더보기
[Android] 앱이 메모리 부족으로 죽을 때 무슨 일이 벌어질까? : LMK와 상태 복원 유튜브를 보다가 카톡에 답장하고 다시 유튜브로 돌아왔는데 보던 영상이 처음부터 다시 시작되는 경험 다들 한 번쯤 있으시죠?백그라운드로 잠깐 보냈을 뿐인데 앱이 리셋되어 있는 겁니다. 사실 이건 버그가 아니라 Android가 메모리를 관리하는 정상 동작인데요.이번 글에서는 앱이 백그라운드에서 조용히 죽는 과정, 그리고 그 와중에 상태를 어떻게 지켜내는지 정리해보려 합니다. 🤔 Android는 앱을 함부로 죽인다데스크톱과 달리 모바일은 메모리가 적습니다.그래서 Android는 메모리가 모자라면 덜 중요한 앱의 프로세스를 강제로 종료해서 공간을 확보하는데요, 이 역할을 하는 게 LMK(Low Memory Killer)입니다. 그렇다면 "덜 중요한"의 기준은 무엇일까요?Android는 프로세스마다 우선순위를 .. 더보기
[Android] AAOS는 일반 Android와 뭐가 다를까? : Android Auto부터 AOSP·GAS까지 저는 최근 AAOS(Android Automotive OS)를 공부하게 됐는데요.처음엔 "Android 개발자니까 금방 적응하겠지"라고 생각했는데, 막상 들여다보니 익숙한 것과 낯선 것이 반반이었습니다. 이번 글에서는 AAOS가 어떤 플랫폼인지, 우리가 아는 Android와 무엇이 같고 무엇이 다른지 개념 위주로 정리해보려 합니다.저도 처음엔 이 둘을 헷갈렸습니다. 🫣 "Android Auto랑 Android Automotive OS...?" 🤔 Android Auto vs Android Automotive OSAndroid Auto는 폰의 화면을 외부 디스플레이에 투사(프로젝션)하는 기술입니다.앱은 여전히 폰에서 실행되고, 디스플레이는 미러링된 UI를 보여주는 껍데기에 가깝죠. 폰이 없으면 아무.. 더보기
[Android] 코루틴은 어느 스레드에서 재개될까? 바로 직전에 작성했던 포스팅에서는 suspend 함수에 대해 자세히 알아보았는데요,이번에는 그럼 그 재실행이 어느 스레드에서 실행되는지 작성해보려고 합니다. 네트워크 응답은 OkHttp의 스레드 풀 어딘가에서 도착하는데, 우리는 그 결과로 UI를 그립니다.응답이 도착한 스레드에서 그대로 재개된다면 CalledFromWrongThreadException이 터져야 할텐데요 🤔 누군가 중간에서 스레드를 갈아타주고 있다는 뜻이겠죠?오늘의 이야기는 Dispatcher입니다. 🤔 Dispatcher, 이름 그대로 배차 담당Dispatcher는 코루틴이 어느 스레드에서 실행될지 배정하는 역할을 합니다.Dispatchers.Main // UI 스레드Dispatchers.IO // 네트워크·파일.. 더보기
[Android] suspend 함수는 어떻게 멈췄다가 다시 실행될까 코루틴에서 suspend 함수를 정말 자주 사용하는데요, 흔히 suspend 함수는 '멈췄다가 다시 실행된다' 라고 하죠그런데 '멈췄다가 다시 실행된다'는 것이 정확히 무엇인지 알고 있나? 하는 생각이 들었습니다. 스레드가 멈추는 건 아닙니다. 메인 스레드에서 suspend 함수를 호출해도 UI는 멀쩡히 돌아가니까요.함수는 분명 중간에서 멈췄는데 스레드는 자유롭게 다른 일을 하고 있고, 시간이 지나면 멈춘 그 지점부터 실행이 이어집니다. 함수 실행 상태는 원래 스레드의 콜 스택에 쌓이는 건데, 스레드가 떠나버렸다면 그 상태는 대체 어디에 보관되는 걸까요? 🤨 💭 suspend 함수 들여다보기먼저 간단한 suspend 함수를 하나 보겠습니다.suspend fun refreshToken(): Toke.. 더보기
[Android] Service는 어떻게 동작할까? : Started, Bound, 그리고 Binder IPC까지 Android에는 Activity, Service, BroadcastReceiver, ContentProvider라는 4대 컴포넌트가 있습니다.이 중 Activity는 매일 만지니까 익숙한데, Service는 어쩐지 "백그라운드에서 도는 무언가" 정도로만 알고 넘어가기 쉬운데요.이번 글에서는 4대 컴포넌트 중 Service에 대해 알아보려 합니다. 음악 앱을 만든다고 생각해보았을 때 재생 버튼, 앨범 커버, 가사 화면까지 열심히 만들었는데, 사용자가 뒤로가기를 누르는 순간 음악이 뚝 끊깁니다. 🤨 당연한 결과인데요. 재생 로직을 전부 PlayerActivity 안에 넣었다면, Activity가 종료되는 순간 음악도 같이 종료됩니다.하지만 사용자 입장에서 음악은 화면과 상관없이 계속 흘러나와야 하죠. 화.. 더보기
[Android] Refresh Token, 탈취당하면 끝일까? : RTR로 방어 레이어 쌓기 인증을 다루다 보면 자연스럽게 토큰 관리에 대한 고민이 생기는데요,Access Token은 수명을 짧게 가져가도록 하고 있지만, 만료 기간이 긴 Refresh Token은 보안 측면에서 고민이 됩니다. 만약 이 Refresh Token이 탈취당한다면? 공격자는 토큰이 만료될 때까지 정상 사용자인 척할 수 있게 됩니다,, 🤨그래서 오늘은 이 문제를 완화하는 대표적인 방식인 RTR(Refresh Token Rotation) 구조에 대해 정리해보려고 합니다. 🤔 RTR이란?RTR은 이름 그대로 Refresh Token을 회전(Rotation)시키는 구조입니다.기존 방식에서는 Access Token이 만료되면 Refresh Token으로 새 Access Token만 발급받았는데요.RTR에서는 재발급 요청.. 더보기
2026 Build with AI: Hands-on Campus 후기 AI를 활발하게 사용하고 있는 요즘, AI 덕분에 빠른 개발과 더 많은 의사결정을 하게 되어 좋은 점도 많지만개발자의 역할과 방향성, AI의 활용 방안 등에 대해 많은 고민이 들었습니다. AI가 이젠 나보다 코드를 더 짜는 것 같은데 개발자로서 난 어떤 역할을 해야할까?AI를 '의미있게' 활용하려면 어떻게 해야할까? 그러던 도중 좋은 행사를 발견하여 참석하게 되었습니다. GDG Campus Korea에서 주최하는 2026 Build with AI: Hands-on Campus 행사였고,AI 관련 세션들로 구성된 행사였는데 총 3개의 세션을 선택해서 들을 수 있었습니다. 각자의 경험을 토대로 AI 시대의 개발자에 대해 이야기하는 자리였는데, 좋은 인사이트들을 얻어온 것 같아 후기로 남겨봅니다 😊 행사 정.. 더보기