콘텐츠로 이동

보안

페이지는 droid.devpier.dev에서 제공되지만, 에뮬레이터와 게이트웨이는 내 Mac에서 실행됩니다. 열어 둔 어떤 웹 페이지든 Mac의 프로그램에 연결을 시도할 수 있으므로, 게이트웨이는 모든 연결을 검사합니다.

게이트웨이는 127.0.0.1에서만 수신합니다. 로컬 네트워크나 인터넷에서 오는 연결은 받지 않습니다. 다른 컴퓨터는 게이트웨이에 접근할 수 없습니다.

브라우저는 페이지가 WebSocket을 열 때 Origin 헤더를 보냅니다. 게이트웨이는 다음 Origin만 허용합니다:

  • https://droid.devpier.dev
  • http://127.0.0.1:<port>
  • http://localhost:<port>

그 밖의 Origin이거나 Origin이 없는 연결은 코드 4003으로 닫힙니다. 다른 사이트의 페이지는 포트를 추측하더라도 에뮬레이터를 제어할 수 없습니다.

  • 게이트웨이는 시작할 때마다 새 무작위 토큰을 만듭니다. 무작위 32바이트를 43자 base64url 문자열로 인코딩한 값입니다.
  • 게이트웨이는 # 뒤에 포트와 토큰을 붙여 페이지를 엽니다: https://droid.devpier.dev/app/#port=<port>&token=<token>. 브라우저는 # 뒤의 부분을 웹 서버로 보내지 않으므로, 토큰은 절대 droid.devpier.dev에 도달하지 않습니다.
  • 페이지는 포트와 토큰을 브라우저의 로컬 스토리지에 저장하므로 페이지를 새로고침할 수 있으며, 주소 표시줄에서는 이를 지웁니다.
  • 모든 연결의 첫 메시지에는 토큰이 있어야 합니다. 토큰이 틀리면 게이트웨이는 bad-token 오류로 응답하고 코드 4001로 연결을 닫습니다.
  • 게이트웨이가 다시 시작되면 이전 토큰은 더 이상 동작하지 않습니다. 게이트웨이가 출력한 새 링크를 여세요.

웹사이트는 Mac에 연결하지 않습니다

섹션 제목: “웹사이트는 Mac에 연결하지 않습니다”

Chrome의 로컬 네트워크 권한과 게이트웨이의 Origin 검사는 모두 경로 단위가 아니라 사이트 단위로 동작합니다. 따라서 문서 페이지는 /app/의 에뮬레이터 페이지와 권한을 공유합니다. 그 영향을 줄이기 위해:

  • /app/의 에뮬레이터 페이지만 게이트웨이에 연결합니다. 홈 페이지와 이 문서는 절대 연결하지 않으므로, 이를 읽어도 권한 요청이 뜨지 않습니다.
  • 사이트는 서드파티 스크립트, 스타일, 글꼴, 미디어를 로드하지 않습니다. 모든 것이 droid.devpier.dev에서 제공됩니다.
  • 토큰은 두 번째 검사입니다. 토큰이 없는 droid.devpier.dev의 페이지는 게이트웨이를 사용할 수 없습니다.

게이트웨이는 묻지 않고 Android SDK 패키지를 설치하거나 기기를 만들지 않습니다. 터미널에서 [y/N]으로 묻고, 기본값은 ’아니요’입니다. Android SDK 라이선스 동의는 직접 합니다.

코드 의미
4000 첫 메시지가 hello가 아니었습니다.
4001 토큰이 틀렸습니다.
4002 페이지와 게이트웨이가 서로 다른 프로토콜 버전을 사용합니다.
4003 허용되지 않은 Origin입니다.

github.com/twosugar/android-emu-web에 이슈를 등록하세요.