Android 앱을 만들 때 필요한 각종 아이콘 크기 정리

스토어에 앱을 등록할 때 필요한 512 px의 아이콘은 매번 보니까 기억을 하겠는데 앱에서 사용하는 아이콘 크기는 기억도 잘 나지 않고 hdpi니 mdpi니 엄청 많은 게 햇갈린다. 그래서 필요할 때 찾아보기 위해 정리한다.

일단은 앱에서 사용할 아이콘이 필요하다. 여기에 잘 정리되어 있고 기본적으로는 48px에 확대하고 축소하고 하면 된다.
표로 만들면 아래와 같다.

Size scale px
ldpi .75x 36 px
mdpi 1x 48 px
hdpi 1.5x 72 px
xhdpi 2x 96 px
xxhdpi 3x 144 px
xxxhdpi 4x 192 px

ldpi는 요즘은 없다고 봐도 무방할 정도고 xxxhdpi는 TV를 위해 새로 나온 것이니 이 두 가지는 빼도 될 것 같다.

게다가 스토어에서 표시될 512 px 아이콘이 하나 필요하고 프로모션용 이미지 180 x 120 px 이미지는 넣어도 되고 굳이 넣지 않아도 된다.
그리고 이번에 새로 나올 스토어를 위해 1024 x 500 px의 이미지가 필요하다.

결과적으로 48, 72, 96, 144 px의 앱 아이콘, 512 px의 스토어 아이콘, 1024 x 500 px의 새로운 스토어용 이미지가 필요하다.

HTTP에서 보안을 조금이나마 강화시키는 헤더들

오늘 STS(Strict-Transport-Security)를 적용하려고 검색을 하다가 몇 가지 처음 보는 헤더들을 찾았다. 이 글에 자세히 설명이 나와있는데 대충 적어보면 이렇다.

1. Content-Security-Policy

누군가 페이지에 외부 스크립트 등을 걸어서 XSS 공격을 할 수 있기 때문에 페이지에서 허용할 origin을 지정할 수 있다. Content의 종류는 아래와 같다.

  1. script-src: JavaScript code (이 헤더를 사용하는 가장 큰 이유다)
  2. connect-src: XMLHttpRequest, WebSockets, and EventSource.
  3. font-src: fonts
  4. frame-src: frame ulrs
  5. img-src: images
  6. media-src: audio & video
  7. object-src: Flash (and other plugins)
  8. style-src: CSS

자신의 사이트와 구글의 각종 스크립트들만 허용하고 싶다면 아래와 같이 적어주면 된다.

Content-Security-Policy: script-src 'self' https://apis.google.com

2. X-Frame-Options

가끔 누군가가 자신의 사이트와 비슷한 도메인을 사서 아무 내용도 없이 자신의 사이트만 전체 크기의 프레임으로 박아놓는 짓을 한다는 글을 몇 번 본 적이 있다. 접근하는 유저만 엄청 끌어모은 다음 나중에 갑자기 내용을 바꿔서 날로먹는 방법이라는데 아무튼 이런 짓을 막을 수 있게 자신의 페이지가 Frame 안에 들어가는 것을 방지하게 해준다. Clickjacking도 막을 수 있겠다.

사용 방법은 아래와 같이 3가지가 있다.

  • X-Frame-Options: DENY (프레임 안에 절대 들어가지 못하게 한다)
  • X-Frame-Options: SAMEORIGIN (같은 origin일 경우에만 허용한다)
  • X-Frame-Options: ALLOW FROM hxtp://some-domain.com (특정 origin에서만 허용한다)

3. X-Content-Type-Options

Github에서 잘 쓰고 있다고 하는데 jpg 확장자로 js파일을 올려 우회를 한 후에 script 태그에 src로 넣는 수법을 방지하는 헤더다. 이 헤더를 넣으면 MIMETYPE과 다르게 사용하지 못하게 한다. nosniff를 넣어주면 활성화가 된다.

4. Strict-Transport-Security

내가 오늘 하려고 했던 STS다. SSL strip 공격을 막기 위해 나온 헤더인데 이 헤더를 받게 되면 브라우저는 다음에 접속할 땐 URL이 http로 지정되어있어도 무시하고 무조건 https로 접속하게 된다. 이런 방법으로 SSL strip 공격을 피할 수 있게 된다.(단, 한 번이라도 이미 접속은 한 상태여야 한다)

사용방법은 그냥 쿠키 지정하듯이 max-age를 초단위로 입력해주면 된다. includeSubDomains를 넣어주면 서브도메인들에도 적용이 되지만 나는 SSL 인증서가 와일드카드가 아니라 그건 뺐다.

참고로 오늘 실험해본 결과 HTTP 통신을 하고 있을 때는 이 헤더를 무시하게 된다. 꼭 301이나 302 리다이렉트를 해서 HTTPS를 사용하게 한 후 이 헤더를 넣자(둘 다 넣어도 상관은 없지만 HTTPS에서 이 헤더를 꼭 한 번은 받아야 한다).

2014/08/02 추가:
STS를 적용하게 되면 해당 도메인에 대한 모든 HTTP 연결이 포트와 관계없이 HTTPS로 전환된다.
다른 포트에서 테스트 앱을 돌리거나 할 때는 IP를 이용해 접속하거나 해야 SSL 오류등이 뜨지 않는다.

모바일 메신저의 알림에 대한 생각

모바일 시대로 넘어오면서 언제든지 알림이 울리기 쉽게 되었지만 그게 오히려 짜증나는 경우가 많다. 특히나 단체 채팅그놈의 카카오톡 단체방을 하게 되면 시도때도 없이 알림이 울리게 되는데 그렇다고 알림을 아예 끄자니 언제 메시지가 오는지 알 수 없다는 문제가 생긴다.
요즘은 IRC에서 자주 대화를 하는데 이건 기본적으로는 알림이 오질 않고 누군가 쿼리(개인 대화)를 보내거나 멘션을 했을 때만 알림이 울리게 된다. 모바일 메신저보다 10년 이상 먼저 나왔지만 이런 점에서는 요즘의 모바일 메신저보다 훨씬 괜찮다. 하지만 그래도 언제 채팅방이 조용한지 대화중인지는 알 수 없다는 단점이 있다.

그래서 몇 년 전부터 생각하고 있던 방법이 있는데 알림이 오기는 오되 같은 방에서 일정 시간 이내에 연속으로 오는 메시지에 대해서는 알림을 울리지 않는 것이다.
그렇게 하면 메시지를 놓치지 않을 수 있고 진동 폭풍에서 벗어날 수 있다. 하지만 어떤 메신저도 이런 기능을 구현하지 않고 있다. 1시간 알림 끄기 정도가 전부이다. 그걸 5분으로 줄이고 메시지가 올 때마다 자동으로 설정하게 하면 끝인데 왜 하질 않는지 모르겠다.

그래서 아예 안드로이드 롬을 뜯어고쳐서 모든 알림에 대해 그렇게 할 수 있게 해버릴 생각도 하고 있다. 일단 CM롬을 사용하고 있으니 거기에 넣을 수 있는지부터 알아봐야겠다.