안전한 소프트웨어를 개발하기 위한 시스템에 관한 글

https://queue.acm.org/detail.cfm?id=3648601

구글에선 소프트웨어를 안전하게 개발할수 있는 환경이 어떻게 되어있는지 공유해준 글인데,

여기도 소프트웨어 개발을 해놓고 오랜 기간동안 유지하면서 업데이트도 해야하니깐 시스템이 복잡해질수밖에 없고, 그러다보면 취약점이 생기게 된다. 

안전하게 코딩하는 것과, 배포 두가지 관점에서 정리를 할수있는데, 

일단 코딩쪽에서 보면 메모리 손상, SQL 인젝션, XSS 등의 보안 취약점이 발생할 수있고, 각 취약점마다 구글에선 어떻게 조심하고 있는지 정리해줬다.

메모리를 위해선 결국 안전한 언어 (c/c++보다는 자바, Go, 또는 Rust)를 쓰는게 좋다는것 .. 

코드 인젝션은 일반 문자열보다는 해당 도메인에 한정된 특정한 타입(ex.  TrustedSqlString)을 사용하는걸 추천.. 비슷하게 XSS도 안전한 타입을 정의해서 쓰는 방식으로  (ex. safehtml), 10년전엔 지메일같은 어플리케이션마다 매년 수십개의 취약점이 발견 되었으나 요즘은 이 방법으로 한자릿수로 많이 줄었다고 한다. 

배포 관점에서는, 엔지니어가 직접 하면 단순 오타같은 실수를 하는 경우가 결국 생기게 되는데, 좀 더 신중했어야 한다고 말하기엔 현실적으론 무리한 기대라는 이야기에 공감이 되었다. 

가능한 실수를 안할수 있도록 어떻게 환경이 구성되어있는지 정리를 해줬다. 

여러번 읽어볼만 하고 (기억력이 안좋은 편..), 레퍼런스도 나중에 시간나면 봐도 좋을것 같아서 좌표 찍을겸 정리를 해봤다. ☺️

Xcode 디버그 콘솔에서 뷰 계층 출력하기

엑스코드에서 뷰 계층을 3D로 예쁘게 보여주는게 이미 되지만 가끔은 특정 뷰 밑으로 쭉 찍어보고 싶을때가 있다.

그럴땐 디버그 콘솔에서 UIView의 숨겨진(?) 함수인 recursiveDescription()를 부르면 된다.

스위프트는 비공식 함수를 부르는 방식이 쉽진 않은데 밑의 방법으로 가능하다.

po view.value(forKey: "recursiveDescription")

그러면 요렇게 나온다.

perform으로도 부를순 있는데

po self.view.perform("recursiveDescription")

뭔가 아까 방법과는 조금 다르게 출력이 되긴 하지만 뷰가 찍히긴 한다.

참고 : https://www.hackingwithswift.com/articles/101/how-to-debug-your-view-hierarchy-using-recursivedescription

[iOS] APNS http/2 지원 API 공개

클라이언트 보다는 서버쪽에 관련된 이야기이지만, http/2 를 지원하는 push api가 공개되었다는 뉴스가 올라왔다.

덕분에 관련 wwdc를 좀 봤는데, http/2를 소개하기를 한 커넥션으로 request와 response를 여러 개 받을 수 있게 된다고 한다. 스트리밍과 비슷한건지 그렇게 비유를 해줬다.  그리고 여러개의 request 중 한 놈이 실패를 하더라도 커넥션은 살아있다고 한다. 클라이언트 쪽에서만 보면 http/2를 위해 따로 대응을 안해줘도 되는 것 같은데, 과연 그럴지 ..

 

덤으로 APNS 쪽에서 새로워진 점은 payload 사이즈가 4kb로 또 늘어나고, device token 길이도 길어진다. silent notification은 앱을 깨우는 형태로 동작하는거 같은데, 동작하는 타이밍은 os단에서 결정하는 모양이다.  apns feedback 서비스도 소개했는데, 이건 다시 알아봐야 할 듯 싶다.

 

 

 

 

비공개 Maven repository를 이용해서 안드로이드 라이브러리 받아오기

라이브러리를 개인적으로 만들어서 공개되지 않은 메이븐 repository로 올려야 할 때가 있다. (ex. 회사 라이브러리)
원래는 필요하다면 비공개 메이븐 repository를 만들려했지만, 이미 구성된 것이 있으므로, build 설정만 해서 사용했다.

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://nexus.localhost:8080/content/repositories/snapshots") {
                authentication(userName: "admin", password: “PASSWORD")
            }
            pom.version = "1.0-SNAPSHOT"
            pom.artifactId = "library-project"
            pom.groupId = "com. library
"
        }
    }
}

그렇게 빌드를 설정한 후 Gradle > uploadArchives빌드를 하면 메이븐 repository에 업로드가 된 것을 볼 수 있다.

uploadArchive_build

build

upload

가져올 때 build 설정

apply plugin: 'android'
apply plugin: 'maven'

repositories {
    maven {
        url "http://nexus.localhost:8080/content/repositories/snapshots/"
        credentials {
            username 'admin'
            password ‘PASSWORD'
        }
    }
}

… 

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
    compile ('com.lib:library-project:1.0-SNAPSHOT@aar')
}

참고

http://stackoverflow.com/questions/22852611/maven-uploadarchives-aar-to-gitlab-maven-repository
http://blog.gaku.net/uploading-aar-to-a-private-maven-repo-from-gradleandroid-studio/
http://www.vandalsoftware.com/post/52468430435/publishing-an-android-library-aar-to-a-maven

호스팅 하기

http://cemerick.com/2010/08/24/hosting-maven-repos-on-github/
http://www.sigil.org/coding/hosting-a-private-maven-repository-using-github/

Git 태그

Git에서 태그따는 방법은 2가지가 있는데, 서명하는 방법(Verifying Tags)과 안하는 방법(Lightweight Tags)가 있다.
보통은 서명을 안하는 방법을 하는 것 같아서 나도 그렇게 한다.

태그를 만드는 명령어는 아래처럼

git tag tag_name -m ‘tag contents’

태그 내용을 확인하고 싶으면

git show tag_name

Remote에 있는 Git에 태그를 올리는 명령어는 아래처럼 하면 된다.

git push origin tag_name

혹은 아래 명령어로 하면 편하다

git push origin – – tags

참고 : http://git-scm.com/book/en/Git-Basics-Tagging