[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en:mobile\u002Fmobile-security-storage":4,"config":211},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":112,"samples":126},"mobile","Mobile","","mobile-security-storage","Mobile Security Storage","en",75,2400,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,85,88,91,94,97,100,103,106,109],{"key":19,"name":20,"count":11},"fl-dart-async-isolates","Fl Dart Async Isolates",{"key":22,"name":23,"count":11},"fl-dart-language-null-safety","Fl Dart Language Null Safety",{"key":25,"name":26,"count":11},"fl-flutter-persistence-storage","Fl Flutter Persistence Storage",{"key":28,"name":29,"count":11},"fl-flutter-platform-channels-lifecycle","Fl Flutter Platform Channels Lifecycle",{"key":31,"name":32,"count":11},"fl-flutter-rendering-widget-tree","Fl Flutter Rendering Widget Tree",{"key":34,"name":35,"count":11},"fl-flutter-state-management-widgets","Fl Flutter State Management Widgets",{"key":37,"name":38,"count":11},"ios-core-data-swiftdata-persistence","Ios Core Data Swiftdata Persistence",{"key":40,"name":41,"count":11},"ios-lifecycle-background-execution","Ios Lifecycle Background Execution",{"key":43,"name":44,"count":11},"ios-memory-management-arc","Ios Memory Management Arc",{"key":46,"name":47,"count":11},"ios-swift-concurrency-structured","Ios Swift Concurrency Structured",{"key":49,"name":50,"count":11},"ios-swift-type-system-optionals","Ios Swift Type System Optionals",{"key":52,"name":53,"count":11},"ios-swiftui-state-rendering","Ios Swiftui State Rendering",{"key":55,"name":56,"count":11},"kt-android-lifecycle-background-execution","Kt Android Lifecycle Background Execution",{"key":58,"name":59,"count":11},"kt-android-memory-context-leaks","Kt Android Memory Context Leaks",{"key":61,"name":62,"count":11},"kt-android-room-persistence","Kt Android Room Persistence",{"key":64,"name":65,"count":11},"kt-jetpack-compose-state-recomposition","Kt Jetpack Compose State Recomposition",{"key":67,"name":68,"count":11},"kt-kotlin-coroutines-flow","Kt Kotlin Coroutines Flow",{"key":70,"name":71,"count":11},"kt-kotlin-type-system-null-safety","Kt Kotlin Type System Null Safety",{"key":73,"name":74,"count":11},"mobile-distribution-ci","Mobile Distribution Ci",{"key":76,"name":77,"count":11},"mobile-navigation","Mobile Navigation",{"key":79,"name":80,"count":11},"mobile-networking-offline","Mobile Networking Offline",{"key":82,"name":83,"count":11},"mobile-performance-battery","Mobile Performance Battery",{"key":8,"name":9,"count":11},{"key":86,"name":87,"count":11},"mobile-state-data","Mobile State Data",{"key":89,"name":90,"count":11},"mobile-testing-automation","Mobile Testing Automation",{"key":92,"name":93,"count":11},"mobile-ui-lifecycle","Mobile Ui Lifecycle",{"key":95,"name":96,"count":11},"rn-javascript-typescript-fundamentals","Rn Javascript Typescript Fundamentals",{"key":98,"name":99,"count":11},"rn-native-bridge-modules","Rn Native Bridge Modules",{"key":101,"name":102,"count":11},"rn-navigation-lifecycle","Rn Navigation Lifecycle",{"key":104,"name":105,"count":11},"rn-networking-persistence-offline","Rn Networking Persistence Offline",{"key":107,"name":108,"count":11},"rn-performance-rendering","Rn Performance Rendering",{"key":110,"name":111,"count":11},"rn-react-hooks-state-management","Rn React Hooks State Management",[113,117,120,123],{"key":114,"name":115,"count":116},"android-kotlin","Android (Kotlin)",450,{"key":118,"name":119,"count":116},"flutter","Flutter",{"key":121,"name":122,"count":116},"ios-swift","iOS (Swift)",{"key":124,"name":125,"count":116},"react-native","React Native",[127,145,158,172,185,198],{"id":128,"topic":9,"difficulty":129,"body":130,"options":131,"correct_key":136,"explanation":144},"019f677d-2bc3-776c-b0fd-4e773bb08b1f",1,"What is the main difference between \"secure storage\" and a plain local file\u002Fpreferences store on a mobile device?",[132,135,138,141],{"key":133,"text":134},"a","Secure storage survives an app uninstall while plain storage never does",{"key":136,"text":137},"b","It is encrypted and OS-gated, unlike plain storage",{"key":139,"text":140},"c","Secure storage is only available for apps built with a paid developer account",{"key":142,"text":143},"d","Secure storage keeps data in memory only and never touches disk","OS-level secure storage encrypts data at rest and ties access to the OS's key management and app identity, so reading it outside the app (e.g. via a rooted\u002Fjailbroken file browse) is far harder than reading a plain preferences file, which is typically stored as readable plaintext.",{"id":146,"topic":9,"difficulty":129,"body":147,"options":148,"correct_key":139,"explanation":157},"019f677d-2bc3-7f24-b656-11b8f42c77c6","Why is it recommended to keep an access token separate from a refresh token when storing authentication credentials on a mobile device?",[149,151,153,155],{"key":133,"text":150},"Because the two tokens must always use a different text encoding",{"key":136,"text":152},"Because only one of them is allowed to be a string value",{"key":139,"text":154},"The refresh token is long-lived, so leaking it is far worse",{"key":142,"text":156},"Because mobile operating systems reject apps that store more than one token","The refresh token can mint new access tokens for a long time, so its compromise is much more damaging. Separating them lets the app apply stricter storage\u002Frotation rules to the refresh token while using the access token more freely for API calls.",{"id":159,"topic":9,"difficulty":160,"body":161,"options":162,"correct_key":133,"explanation":171},"019f677d-2bc4-75ac-b099-02776513eb56",2,"In the context of mobile authentication, what is a biometric \"gate\" typically used for?",[163,165,167,169],{"key":133,"text":164},"Gating access to an already-stored secret with a fingerprint\u002Fface check",{"key":136,"text":166},"Replacing the server-side authentication entirely so the backend never verifies the user again",{"key":139,"text":168},"Generating the user's password from their fingerprint pattern",{"key":142,"text":170},"Transmitting the raw biometric image to the backend for storage","Biometrics gate access to something already stored (e.g. unlocking a locally held credential) — the biometric data itself stays on-device and is not the secret being protected or sent anywhere.",{"id":173,"topic":9,"difficulty":160,"body":174,"options":175,"correct_key":142,"explanation":184},"019f677d-2bc4-7bde-88e9-0488cfd507c6","A junior developer stores the user's session token as a plain string inside the app's regular (unencrypted) local preferences file, reasoning \"the app sandbox already protects it.\" What is the main risk being overlooked?",[176,178,180,182],{"key":133,"text":177},"Plain preferences files cannot hold string values at all",{"key":136,"text":179},"The app sandbox actively re-encrypts every file automatically, so this is actually safe",{"key":139,"text":181},"The token would expire immediately if stored this way",{"key":142,"text":183},"Rooted\u002Fjailbroken devices can read unencrypted files outside the sandbox","The sandbox helps under normal OS conditions, but it is not the only threat model: rooted\u002Fjailbroken devices, insecure backups, or malware with elevated privileges can read unencrypted app files directly, defeating sandbox-only protection.",{"id":186,"topic":9,"difficulty":129,"body":187,"options":188,"correct_key":136,"explanation":197},"019f677d-2bc5-7456-8c58-4d8a9fc4844d","What is \"certificate pinning\" in a mobile app's network layer, at a conceptual level?",[189,191,193,195],{"key":133,"text":190},"Saving the server's response body to disk so it can be reused offline",{"key":136,"text":192},"Verifying the server's certificate matches a specific expected value",{"key":139,"text":194},"Attaching a physical security key to the device before making network calls",{"key":142,"text":196},"Encrypting the app's UI screenshots before storing them","Certificate pinning narrows trust: rather than accepting any certificate chain that a trusted root CA has signed, the app checks the server's certificate\u002Fkey against a value it already knows, which blocks certain interception attacks even if a CA is compromised.",{"id":199,"topic":9,"difficulty":160,"body":200,"options":201,"correct_key":133,"explanation":210},"019f677d-2bc5-7be4-8249-3cd80ccff5c4","Why should sensitive values (tokens, passwords) generally be avoided in debug\u002Fconsole log statements, even in a development build?",[202,204,206,208],{"key":133,"text":203},"Logs can be collected by crash-reporting tools or shared debug output",{"key":136,"text":205},"Log statements automatically get sent to the app store review team",{"key":139,"text":207},"The OS deletes the app if sensitive text appears in a log",{"key":142,"text":209},"Logging a string value converts it to be permanently unencrypted in storage","Even \"just debug\" logs can be picked up by system log buffers, crash\u002Fanalytics SDKs, or shared logcat\u002Fconsole output, so sensitive values written there leak outside the controlled storage layer the developer thinks they are protecting.",{"fields":212,"seniorities":388,"interview_shapes":389,"locales":394,"oauth":396,"question_count":399,"coach_enabled":400,"jd_match_enabled":400},[213,238,258,275,299,312,331,340,362,369,375,382],{"key":214,"name_tr":215,"name_en":215,"sort":129,"specializations":216},"backend","Backend",[217,220,223,226,229,232,235],{"key":218,"name":219,"field":214},"general","Genel",{"key":221,"name":222,"field":214},"go","Go",{"key":224,"name":225,"field":214},"python","Python",{"key":227,"name":228,"field":214},"java","Java",{"key":230,"name":231,"field":214},"csharp","C#\u002F.NET",{"key":233,"name":234,"field":214},"nodejs","Node.js",{"key":236,"name":237,"field":214},"php","PHP",{"key":239,"name_tr":240,"name_en":240,"sort":160,"specializations":241},"frontend","Frontend",[242,243,246,249,252,255],{"key":218,"name":219,"field":239},{"key":244,"name":245,"field":239},"javascript","JavaScript",{"key":247,"name":248,"field":239},"typescript","TypeScript",{"key":250,"name":251,"field":239},"react","React",{"key":253,"name":254,"field":239},"vue","Vue",{"key":256,"name":257,"field":239},"angular","Angular",{"key":259,"name_tr":260,"name_en":260,"sort":261,"specializations":262},"fullstack","Fullstack",3,[263,264,265,266,267,268,269,270,271,272,273,274],{"key":218,"name":219,"field":259},{"key":221,"name":222,"field":214},{"key":224,"name":225,"field":214},{"key":227,"name":228,"field":214},{"key":230,"name":231,"field":214},{"key":233,"name":234,"field":214},{"key":236,"name":237,"field":214},{"key":244,"name":245,"field":239},{"key":247,"name":248,"field":239},{"key":250,"name":251,"field":239},{"key":253,"name":254,"field":239},{"key":256,"name":257,"field":239},{"key":276,"name_tr":277,"name_en":277,"sort":278,"specializations":279},"devops-cloud","DevOps \u002F Cloud",4,[280,281,284,287,290,293,296],{"key":218,"name":219,"field":276},{"key":282,"name":283,"field":276},"aws","AWS",{"key":285,"name":286,"field":276},"gcp","GCP",{"key":288,"name":289,"field":276},"azure","Azure",{"key":291,"name":292,"field":276},"kubernetes","Kubernetes",{"key":294,"name":295,"field":276},"terraform","Terraform",{"key":297,"name":298,"field":276},"linux","Linux",{"key":300,"name_tr":301,"name_en":301,"sort":302,"specializations":303},"ai-engineer","AI Engineer",5,[304,305,306,309],{"key":218,"name":219,"field":300},{"key":224,"name":225,"field":300},{"key":307,"name":308,"field":300},"llm-rag","LLM\u002FRAG",{"key":310,"name":311,"field":300},"mlops","MLOps",{"key":313,"name_tr":314,"name_en":315,"sort":316,"specializations":317},"database","Veritabanı","Database",6,[318,319,322,325,328],{"key":218,"name":219,"field":313},{"key":320,"name":321,"field":313},"postgresql","PostgreSQL",{"key":323,"name":324,"field":313},"mysql","MySQL",{"key":326,"name":327,"field":313},"mongodb","MongoDB",{"key":329,"name":330,"field":313},"redis","Redis",{"key":5,"name_tr":332,"name_en":6,"sort":333,"specializations":334},"Mobil",7,[335,336,337,338,339],{"key":218,"name":219,"field":5},{"key":121,"name":122,"field":5},{"key":114,"name":115,"field":5},{"key":118,"name":119,"field":5},{"key":124,"name":125,"field":5},{"key":341,"name_tr":342,"name_en":343,"sort":344,"specializations":345},"security","Güvenlik","Security",8,[346,347,350,353,356,359],{"key":218,"name":219,"field":341},{"key":348,"name":349,"field":341},"appsec","AppSec",{"key":351,"name":352,"field":341},"offensive-pentest","Offensive \u002F Pentest",{"key":354,"name":355,"field":341},"cloud-security","Cloud Security",{"key":357,"name":358,"field":341},"devsecops","DevSecOps",{"key":360,"name":361,"field":341},"blue-team-incident","Blue Team \u002F Incident",{"key":363,"name_tr":364,"name_en":365,"sort":366,"specializations":367},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[368],{"key":218,"name":219,"field":363},{"key":370,"name_tr":371,"name_en":371,"sort":372,"specializations":373},"data-engineer","Data Engineer",10,[374],{"key":218,"name":219,"field":370},{"key":376,"name_tr":377,"name_en":378,"sort":379,"specializations":380},"game-dev","Oyun Geliştirme","Game Development",11,[381],{"key":218,"name":219,"field":376},{"key":383,"name_tr":384,"name_en":384,"sort":385,"specializations":386},"ml-engineer","ML Engineer",12,[387],{"key":218,"name":219,"field":383},[14,15,16],{"junior":390,"mid":392,"senior":393},{"questions":391,"median_sec":3},20,{"questions":391,"median_sec":3},{"questions":391,"median_sec":3},[395,10],"tr",[397,398],"google","github",21750,true]