스토리 홈

인터뷰

피드

뉴스

조회수 4491

안드로이드 앱의 Persistent data를 제대로 암호화해 보자! (2/2)

들어가기1부에서는, KeyStore 를 사용해 Shared Preferences 를 암호화 하는 법에 대해 알아봤습니다. 그리고 이 글에서는 Room을 사용한 Database 를 암호화 하는 방법에 대해 설명합니다.2018년 현재, 안드로이드 자체에서 데이터베이스를 암호화하는 기능을 제공해 주진 않습니다. 따라서 오픈 소스 프로젝트인 SQLCipher, SafeRoom 의 사용법 위주로 설명할 예정입니다. 또한 KeyStore 에 대칭키를 생성하는 기능은 API Level 23 이후에서만 가능하며, SQLCipher 가 Android KeyStore 를 지원하지 않고 있습니다.이로 인해 1부에서 소개한 키 암호화 메커니즘으로 보호한 별도의 키를 디스크 어딘가에 저장해 두고, 필요할 때만 복호화 해서 쓴 다음 복호화된 내용을 지우는 방식으로 구현해야 합니다. 하지만 이런 방식으로 사용하는 키는 메모리에 순간적으로 남기 때문에 좋은 공격 표면(Attack surface) 이 됩니다. 그 이유도 함께 다뤄 보겠습니다.SqlCipher team 에서 하루라도 빨리 현재의 char[] 형식의 passphrase 를 입력받는 대신, JCA 를 사용해 암호화하는 데이터베이스를 구현하길 기대해 봅시다.SqlCipher1부에서 보여드렸다시피 internal storage 에 저장한 데이터는 결코 안전하지 않습니다. 파일 DB 인 Sqlite 데이터는 포맷을 모르면 어차피 볼 수 없을테니 조금 다르지 않을까요? 그렇지 않다는 것을 다음 예에서 보여드리겠습니다. 루팅한 디바이스에서 adb pull명령으로 sqlite3 데이터베이스를 추출 후 내용을 열어보면 다음과 같습니다.$ hexdump -vC secure_database.sqlite3 00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.| 00000010  10 00 02 02 00 40 20 20  00 00 00 02 00 00 00 04  |.....@  ........| 00000020  00 00 00 00 00 00 00 00  00 00 00 04 00 00 00 04  |................| 00000030  00 00 00 00 00 00 00 04  00 00 00 01 00 00 00 00  |................| 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................| 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 02  |................| 00000060  00 2e 01 5a 0d 0f 95 00  02 0e a9 00 0e a9 0f c9  |...Z............| 00000070  0e 6f 0e 6f 00 00 00 00  00 00 00 00 00 00 00 00  |.o.o............| ... 00000d30  00 00 00 00 00 82 37 03  07 17 57 57 01 83 4d 74  |......7...WW..Mt| 00000d40  61 62 6c 65 73 71 6c 69  74 65 62 72 6f 77 73 65  |ablesqlitebrowse| 00000d50  72 5f 72 65 6e 61 6d 65  5f 63 6f 6c 75 6d 6e 5f  |r_rename_column_| 00000d60  6e 65 77 5f 74 61 62 6c  65 73 71 6c 69 74 65 62  |new_tablesqliteb| 00000d70  72 6f 77 73 65 72 5f 72  65 6e 61 6d 65 5f 63 6f  |rowser_rename_co| 00000d80  6c 75 6d 6e 5f 6e 65 77  5f 74 61 62 6c 65 05 43  |lumn_new_table.C| 00000d90  52 45 41 54 45 20 54 41  42 4c 45 20 60 73 71 6c  |REATE TABLE `sql| 00000da0  69 74 65 62 72 6f 77 73  65 72 5f 72 65 6e 61 6d  |itebrowser_renam| 00000db0  65 5f 63 6f 6c 75 6d 6e  5f 6e 65 77 5f 74 61 62  |e_column_new_tab| 00000dc0  6c 65 60 20 00 00 00 00  00 00 00 00 00 00 00 09  |le` ............| ... [리스트 1] Internal storage 에 저장된 SQLite3 database 를 dump 한 결과.역시 기대했던대로 데이터가 하나도 암호화되어 있지 않은 것을 확인할 수 있습니다. 그렇다면 가장 간단한 방법은 SQLiteDatabase클래스를 확장하는 일일 텐데요, 문제는 이 클래스가 final 로 상속 불가능하게 되어 있단 점입니다. 이 때문에 암호화된 SQLiteDatabase 구현체는 이 클래스 및 이 클래스에 강하게 결합되어 있는 SQLiteOpenHelper 를 온전히 쓸 수 없다는 문제가 있습니다. 즉, 바닥부터 새로 만들어야 하는 상황인데요, 다행히도 Zetetic 사에서 만든 SQLCipher for Android 는 이 문제를 모두 해결해 주는 고마운 오픈 소스 프로젝트입니다.SqlCipher 의 사용법은 기존의 SQLiteDatabase 에 의존하던 로직들의 import namespace 만 바꿔주면 되도록 구현되어 있어 마이그레이션 비용도 거의 들지 않습니다.// 안드로이드에서 제공해 주는 SQLiteDatabase 클래스명 import android.database.sqlite.SQLiteDatabase; // SqlCipher 에서 제공해 주는 SQLiteDatabase 클래스명 import net.sqlcipher.database.SQLiteDatabase; // 프로그램 시작시 native library 를 로드해줘야 한다. class MyApplication extends android.app.Application {    @Override public void onCreate() {        super.onCreate();        net.sqlcipher.database.SQLiteDatabase.loadLibs(this);    } } [리스트 2] android SQLiteDatabase 에서 SqlCipher SQLiteDatabase 로 마이그레이션 하기물론 두 클래스는 전혀 타입 호환되지 않지만, net.sqlcipher.database.SQLiteDatabase 의 모든 메소드 및 field의 signature 가 기본 android.database.sqlite.SQLiteDatabase 와 같기 때문에 이런 변경이 가능합니다. SqlCipher 개발팀의 수고에 박수를 보냅니다.RoomRoom 은 SQL 을 객체로 매핑해 주는 도구입니다. Room 을 이용해 데이터베이스를 열 때는 보통 아래와 같은 코드를 사용합니다.object Singletons {    val db: DataSource by lazy {        Room.databaseBuilder(appContext, DataSource::class.java, "secure_database")            .build()    } } abstract class DataSource: RoomDatabase() {    abstract fun userProfileDao(): UserProfileDao } // 클라이언트 코드에서 아래와 같이 호출 val userProfile: UserProfile = Singletons.db.userProfileDao().findUserByUid(userId) [리스트 3] Room database 의 정의 및 활용Sqlite 의 기본 동작은 파일 데이터베이스에 단순 Read 및 Write 만 합니다. 따라서 데이터베이스 접근시 암호화/복호화 동작을 하는 callback 을 주입해야 데이터베이스를 암호화 할 수 있습니다. 그리고 RoomDatabase.Builder 클래스는 데이터베이스를 열때 우리가 주입한 일을 할 수 있는 hook method(openHelperFactory) 를 제공해 주고 있습니다. 다음 코드를 살펴봅시다.class RoomDatabase.Builder {    class Builder {        /**        * Sets the database factory. If not set, it defaults to {@link FrameworkSQLiteOpenHelperFactory}.        */        @NonNull        public Builder openHelperFactory(@Nullable SupportSQLiteOpenHelper.Factory factory)    } } interface SupportSQLiteOpenHelper {    /**     * Create and/or open a database that will be used for reading and writing.     */    SupportSQLiteDatabase getWritableDatabase();    /**     * Create and/or open a database. This will be the same object returned by {@link #getWritableDatabase}.     */    SupportSQLiteDatabase getReadableDatabase();    /**     * Factory class to create instances of {@link SupportSQLiteOpenHelper} using {@link Configuration}.     */    interface Factory {        /**         * Creates an instance of {@link SupportSQLiteOpenHelper} using the given configuration.         */        SupportSQLiteOpenHelper create(Configuration configuration);    } } [리스트 4] Room builder 의 SupportSQLiteOpenHelper 주입 메소드 및 SupportSQLiteOpenHelper.Factory 인터페이스 정의설명을 최대한 간소하게 하기 위해 관심가질 필요 없는 코드 및 코멘트는 모두 제외했습니다. 아무튼 SupportSQLiteOpenHelper 구현체를 주입하면 뭔가 데이터베이스 작업 이전에 우리의 로직을 실행할 수 있을 것 같습니다.사실 이 인터페이스의 핵심은 바로 getWritableDatabase(), getReadableDatabase() 구현입니다. javadoc 에도 있지만 두 메소드로 반환하는 인스턴스는 같아야 하며 또한 암호화를 지원해야 한다는 것을 알 수 있습니다.결국 우리 목표는 Room 과 데이터베이스 암호화 로직을 연결해 주는 SupportSQLiteDatabase 구현체를 만드는 것임을 알 수 있습니다. 이 인터페이스는 규모가 제법 크기 때문에 이게 만만한 일이 아님을 직감하실 수 있을 겁니다.saferoom 도입으로 SupportSQLiteDatabase 인터페이스 구현체 사용하기앞서 살펴봤듯 SupportSQLiteDatabase 구현에는 상당한 노력이 필요하단 것을 알 수 있습니다. 그런데 고맙게도 saferoom 이라는 오픈 소스 프로젝트가 우리의 귀찮음을 잘 해결해 주고 있습니다. saferoom 의 SupportSQLiteOpenHelper 구현체를 간단히 살펴보면 아래와 같습니다./** * SupportSQLiteOpenHelper.Factory implementation, for use with Room  * and similar libraries, that supports SQLCipher for Android.  */ public class SafeHelperFactory implements SupportSQLiteOpenHelper.Factory {    private final char[] passphrase;    public SafeHelperFactory(final char[] passphrase) {        this.passphrase = passphrase;    }    @Override    public SupportSQLiteOpenHelper create(final SupportSQLiteOpenHelper.Configuration configuration) {        return(new com.commonsware.cwac.saferoom.Helper(configuration.context,            configuration.name, configuration.version, configuration.callback,            this.passphrase));    }    /**     * NOTE: this implementation zeros out the passphrase after opening the database     */    @Override    public SupportSQLiteDatabase getWritableDatabase() {        SupportSQLiteDatabase result = delegate.getWritableSupportDatabase(passphrase);        for (int i = 0; i < passphrase>            passphrase[i] = (char) 0;        }        return(result);    }    /**     * NOTE: this implementation delegates to getWritableDatabase(), to ensure that we only need the passphrase once     */    @Override    public SupportSQLiteDatabase getReadableDatabase() {        return getWritableDatabase();    } } /**  * SupportSQLiteOpenHelper implementation that works with SQLCipher for Android  */ class Helper implements SupportSQLiteOpenHelper {    final OpenHelper delegate;    Helper(Context context, String name, int version, SupportSQLiteOpenHelper.Callback callback, char[] passphrase) {        net.sqlcipher.database.SQLiteDatabase.loadLibs(context);        this.delegate = createDelegate(context, name, version, callback);        this.passphrase = passphrase;    }    abstract static class OpenHelper extends net.sqlcipher.database.SQLiteOpenHelper {        SupportSQLiteDatabase getWritableSupportDatabase(char[] passphrase) {            SQLiteDatabase db = super.getWritableDatabase(passphrase); return getWrappedDb(db);        }    } } [리스트 5] Saferoom 의 SupportSQLiteOpenHelper 구현체.소스 코드를 보면 SQLiteDatabase 의 원래 요구사항을 만족하지 못하는 구현 부분도 보입니다만, 그래도 이 정도면 수고를 꽤 크게 덜 수 있어 훌륭합니다.그리고 로직을 잘 보면 데이터베이스를 연 직후 암호로 넘겨준 char[] 배열을 초기화 하는 코드가 있다는 점입니다. 이것이 바로 이 문서의 서두에서 말했던 attack surface 를 최소화 하기 위한 구현입니다. 이 글의 주제에서 벗어난 내용이기에 여기서는 다루지 않습니다만, 궁금하신 분들은 부록 1: in-memory attack 맛보기에서 확인하실 수 있습니다.SqlCipher + SafeRoom + Room 구현 및 코드 설명이상으로 데이터베이스 암호화 전략에 대해 살펴봤습니다. 이 장에서는 실제로 연동하는 방법에 대해 다룹니다.불행히도 2018년 현재 SqlCipher 는 Android KeyStore 를 지원하지 않고 있습니다. 그리고 인스턴스 생성에 쓸 비밀번호로 CharArray 가 필요한데, 이 값은 한번 정해지면 불변해야 합니다. 여기 사용할 키를 KeyStore 에 저장하면 문제를 깔끔하게 해결할 수 있을 것 같습니다. 하지만 1부에서 살펴봤듯이 하드웨어로 구현된 Android KeyStore 밖으로는 키가 절대로 노출되지 않는다고 합니다. 이 문제를 어떻게 해결해야 할까요?먼저, SqlCipher 에 사용하기 위해 KeyStore 로 생성한 AES256 키의 내용을 한번 살펴봅시다.val secretKey = with(KeyGenerator.getInstance("AES", "AndroidKeyStore"), {    init(KeyGenParameterSpec.Builder(alias,             KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)        .setKeySize(256)        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)        .build())    generateKey() }) val keyInfo = with(KeyFactory.getInstance(privKey.getAlgorithm(), "AndroidKeyStore"), {    factory.getKeySpec(privKey, KeyInfo::class.java) }) println("Key algorithm : " + secretKey.algorithm) println("Key format : " + secretKey.format) println("Encoded key size: " + secretKey.encoded?.size) println("Hardware-backed : " + keyInfo.isInsideSecureHardware) // 실행 결과 Key algorithm : AES Key format : null Encoded key size: null Hardware-backed : true [리스트 6] AndroidKeyStore 에 저장한 Key 는 어플리케이션에서 직접 쓸 수 없다.저희가 보유중인 개발 시료 Nexus 5 에서 실행한 결과 위와 같이 나타났습니다. secretKey.encoded 의 값이 메모리에 있다면 이 값을 SqlCipher 생성자에 넘겨줄 수 있겠지만 값이 null 이네요. 보안 측면에서는 다행일 지 모르지만 우리 구현에서는 쓸 수 없으니 문제입니다. 그래서 별 수 없이 임의로 키를 만들고(AndroidAesHelper#generateRandomKey()), 1부에서 소개했던 AndroidRsaCipherHelper 를 이용해 암호화한 값을 Shared Preferences에 저장하는 식으로 구현해 봅시다.val settingsPrefs = appContext.getSharedPreferences("app_settings", Context.MODE_PRIVATE) val settings = SecureSharedPreferences.of(settingsPrefs) val dbPass = with(settings, {    /*     * String.toCharArray() 같은 함수를 쓰면 로직이 좀더 간단해지지만, JVM 에서의 String은     * Immutable 하기 때문에 GC 이전에는 지울 방법이 없으므로 attack surface 가 더 오랫동안     * 노출되는 부작용이 있다. 따라서 key의 plaintext 는 가급적 String 형태로 저장하면 안된다.     */    var savedDbPass = getString("DB_PASSPHRASE", "")    if (savedDbPass.isEmpty()) {        // KeyStore 에 저장해도 SqlCipher 가 써먹질 못하니 그냥 1회용 키 생성 용도로만 활용한다.        val secretKey = AndroidAesCipherHelper.generateRandomKey(256)        // String 생성자 사용: 이 문자열은 heap 에 저장된다.        savedDbPass = String(Base64.encode(secretKey, Base64.DEFAULT))        putString("DB_PASSPHRASE",  AndroidRsaCipherHelper.encrypt(savedDbPass))        // 메모리 내에 plaintext 형태로 존재하는 attack surface 를 소멸시켜 준다.        secretKey.fill(0, 0, secretKey.size - 1)    } else {        // decrypt 메소드 내부에서 String 생성자 사용하므로 base64 인코딩된 plaintext 키는 heap 에 저장된다.        savedDbPass = AndroidRsaCipherHelper.decrypt(savedDbPass)    }    val dbPassBytes = Base64.decode(savedDbPass, Base64.DEFAULT)    /*     * SqlCipher 내부에서는 이 char[] 배열이 UTF-8 인코딩이라고 가정하고 있다.     * 그리고 UTF-8 인코딩에서는 byte range 의 char 는 1 바이트니까,     * 아래 변환을 거치더라도 키 길이는 32 byte(256 bit)가 유지된다.     *     * UTF-8 인코딩에서는 32 글자 != 32 바이트가 아님에 항상 유의해야 한다!     */    CharArray(dbPassBytes.size, { i -> dbPassBytes[i].toChar() }) }) [리스트 7] 암호화한 SqlCipher 용 passphrase 를 사용하는 방법.위 코드를 사용해 char[] 타입의 값 dbPass 를 얻을 수 있습니다. 리스트 7을 이용해 얻은 dbPass를 아래 코드에 사용하면 SqlCipher - SafeRoom - Room 의 연동이 끝납니다.val dataSource = Room.databaseBuilder(_instance, DataSource::class.java, "secure_database") .openHelperFactory(SafeHelperFactory(dbPass))                .build() // 메모리 내에 plaintext 형태로 존재하는 attack surface 를 소멸시켜 준다. dbPass.fill('0', 0, dbPass.size - 1) [리스트 8] SqlCipher - SafeRoom - Room 연동하기위 코드에서 볼 수 있듯, 임의로 저장한 키를 Base64 인코딩으로 변환, 그리고 그것을 다시 CharArray 로 변환하는 과정에서 key 가 메모리에 존재해야 하는 순간이 있습니다. 이 구간을 바로 공격 표면(attack surface) 이라고 합니다.JVM 단에서 넘겨주는 Passphrase 를 SqlCipher 내부에서 native 로 어떻게 처리하고 있는지는 SqlCipher SQLiteDatabase 구현및 SqlCipher crypto 구현 에서 확인할 수 있습니다.결과 확인하기SafeHelperFactory 를 주입한 Room database 파일을 추출 후 hexdump 로 확인해 보겠습니다.hwan@ubuntu:~$ hexdump -vC secure_database.sqlite3 00000000  8c 0d 04 07 03 02 11 eb  a4 18 33 4f 93 e8 ed d2  |..........3O....| 00000010  e9 01 21 d7 49 df 25 9a  f4 1d c7 1e ff 2d b0 13  |..!.I.%......-..| 00000020  fc 17 9b 4b b2 1c a3 1d  7d 1d 69 76 b1 ea ec e8  |...K....}.iv....| 00000030  1f 50 e4 c4 6c 50 e6 82  58 27 b9 fe 85 21 27 99  |.P..lP..X'...!'.| 00000040  ec 54 53 ba 32 c6 59 09  b4 30 65 39 a0 75 3e c4  |.TS.2.Y..0e9.u>.| 00000050  b8 f7 ea 47 14 df c4 f0  7c be 9f 62 26 49 1c b2  |...G....|..b&I..| 00000060  0f 63 00 7a 09 7e 33 e0  43 2b eb ea 80 21 bb 5d  |.c.z.~3.C+...!.]| 00000070  5c 04 ff 57 a3 a3 7f c2  19 42 b9 67 6c e3 d5 c8  |\..W.....B.gl...| ... 00000d30  c1 f3 93 1f 4e 5b 6a 70  39 c2 e9 2c 3e 8f 7e ff  |....N[jp9..,>.~.| 00000d40  73 3a 9a 39 0d 8a 1a 3e  6b d4 5b de 1f 6d c4 b8  |s:.9...>k.[..m..| 00000d50  fb 62 3e 21 09 0a 31 20  37 5d 8d 0a 39 6d 35 31  |.b>!..1 7]..9m51| 00000d60  26 d6 b0 22 41 7e 6c 54  7d 77 22 ba 1b f3 cf 5a  |&.."A~lT}w"....Z| 00000d70  e5 47 97 76 f0 89 e5 98  b3 37 3c 8d 43 af 0e b9  |.G.v.....7<.C...| 00000d80  18 74 fd f5 2a 41 d8 b1  d9 70 32 0b 5c 93 4b 0d  |.t..*A...p2.\.K.| 00000d90  bc 60 4c 25 9a ec 53 23  90 60 b2 52 a8 a1 b1 87  |.`L%..S#.`.R....| 00000da0  f3 3e 03 3e ac 0a 75 a0  61 d8 bd 07 b8 5a 48 66  |.>.>..u.a....ZHf| 00000db0  57 85 13 ac 04 26 55 30  34 46 57 bf 8b 42 c6 2d  |W....&U04FW..B.-| 00000dc0  9e 82 a2 df 77 bb b3 2e  96 43 70 23 23 03 df 1d  |....w....Cp##...| ... [리스트 9] Internal storage 에 저장된 SQLite3 database 를 dump 한 결과. 리스트 1과 비교해 보자.이로서 오픈 소스의 힘을 빌려 우리 앱의 데이터베이스를 비교적 간편하게 암호화 할 수 있음을 알 수 있습니다.맺으며이로서 Persistent data 암호화에 대한 설명을 마칩니다. Android KeyStore 가 API Level 23 이상의 기기에서만 100% 동작한다는 점은 2018년 현재까지는 큰 단점입니다. 하지만 사소한 데이터라 하더라도 보안의 중요성은 날로 강조되고 있습니다. 따라서 빠르던 늦던 고객 데이터 암호화에 투자해야 할 순간이 다가온다는 점은 변하지 않습니다.언젠가는 적용해야 할 고객 데이터 보호의 순간에, 이 글이 여러분의 앱의 보안에 조금이나마 도움이 된다면 좋겠습니다.부록 1: in-memory attack 맛보기앞서 계속 반복해서 설명드렸던 메모리 내의 attack surface 를 찾아내는 방법을 간단히 설명해 보겠습니다. 잘 지키려면 잘 공격하는 법을 알아야 하므로 알아두면 좋지 않을까요? 그리고 일반적인 앱 개발과는 다소 동떨어진 이 장의 내용이 이해되지 않으신다면 한줄요약한 메모리 내부의 값도 때로는 안전하지 않을 수 있다 는 한마디만 기억해 두시면 됩니다. 모든 데모는 LG Nexus 5(Hammerhead), 시스템 버전 6.0.1(M) 에서 실행한 결과며 시스템마다 약간의 차이는 있을 수 있습니다.마켓에 출시한 앱들은 debuggable:false 가 설정된 상태이므로 힙 덤프를 바로 뜰 수는 없습니다. 그런데 어떻게 in-memory attack 이 가능할까요? 다음 리스트는 디버그 불가능한 앱의 힙 덤프를 시도할 때 보안 정책 위반 오류가 발생함을 보여줍니다.hwan@ubuntu:~$ adb shell ps | grep "com.securecompany.secureapp" USER PID PPID VSIZE RSS WCHAN PC NAME u0_a431   25755 208   1700384 100888 sys_epoll_ 00000000 S   com.securecompany.secureapp hwan@ubuntu:~$ adb shell am dumpheap 25755 "/data/local/tmp/com.securecompany.secureapp.heap" java.lang.SecurityException: Process not debuggable: ProcessRecord{b6f96fc 25755:com.securecompany.secureapp/u0_a431}     at android.os.Parcel.readException(Parcel.java:1620)     at android.os.Parcel.readException(Parcel.java:1573)     at android.app.ActivityManagerProxy.dumpHeap(ActivityManagerNative.java:4922)     at com.android.commands.am.Am.runDumpHeap(Am.java:1248)     at com.android.commands.am.Am.onRun(Am.java:377)     at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)     at com.android.commands.am.Am.main(Am.java:100)     at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)     at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:251) [리스트 10] debuggable=false 설정된 앱의 힙 덤프 시도시 발생하는 예외(SecurityException)SuperUser 는 가능할까요? SuperUser 권한으로 앱을 강제로 디버그 가능한 상태로 시작해 보도록 하겠습니다.hwan@ubuntu:~$ adb shell 32|shell@hammerhead:/ $ su 1|root@hammerhead:/ \# am start -D -n "com.securecompany.secureapp/MainActivity" && exit Starting: Intent { cmp=com.securecompany.secureapp/MainActivity } hwan@ubuntu:~$ \# adb shell ps | grep "com.securecompany.secureapp" USER PID PPID VSIZE RSS WCHAN PC NAME u0_a431   27482 211   1700384 100888 sys_epoll_ 00000000 S   com.securecompany.secureapp hwan@ubuntu:~$ adb forward tcp:12345 jdwp:27482 hwan@ubuntu:~$ netstat -an | grep 12345                                                           tcp4       0      0  127.0.0.1.12345         *.*                    LISTEN     hwan@ubuntu:~$ jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=12345 java.net.SocketException: Connection reset     at java.net.SocketInputStream.read(SocketInputStream.java:210)     at java.net.SocketInputStream.read(SocketInputStream.java:141)     at com.sun.tools.jdi.SocketTransportService.handshake(SocketTransportService.java:130)     at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:232)     at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)     at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)     at com.sun.tools.example.debug.tty.VMConnection.attachTarget(VMConnection.java:519)     at com.sun.tools.example.debug.tty.VMConnection.open(VMConnection.java:328)     at com.sun.tools.example.debug.tty.Env.init(Env.java:63)     at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1082) Fatal error:  Unable to attach to target VM. [리스트 12] SuperUser 권한으로도도 Java 디버거를 붙일 수 없다.다행히도 debuggable=false 로 릴리즈한 앱은 자바 디버거(jdb)를 붙일 수 없으니 프로그램 실행을 매우 정밀하게 제어할 수는 없다는 것을 알 수 있습니다(debuggable=true 설정된 앱에 위 과정을 실행하면 어떤 일이 벌어지는지 직접 확인해 보세요!).하지만 안드로이드의 앱은 ‘linux process’ 에서 실행되므로 SuperUser 권한으로 process 메모리 전체 dump를 뜨는 것은 막을 수 없습니다. 정공법으로는 /proc/PID/maps 의 내용을 분석하면 됩니다만 제가 안드로이드를 깊게 알고 있는 것은 아니라, 어느 영역이 dalvik heap 인지를 알아낼 수 없었습니다. 이 때문에 프로세스 메모리를 통째로 떠서 내용을 헤집어보는 방식으로 공격해 보겠습니다. 여담입니다만, 데모를 위해 공격한 앱은 dumpsys 명령으로 확인해보니 약 6MiB 의 Java heap 을 쓰고 있는데요, 이 크기를 줄이면 줄일 수록 공격이 더욱 수월할 겁니다.아래 데모에서는 안드로이드 기기용(arm-linux-gnueabi)으로 컴파일한 gdb 를 미리 설치한 결과를 보여드리고 있습니다. 참고로 여기 보이는 [heap] 은 아쉽지만 native heap 이므로 우리 공격 목표는 아닙니다.1|root@hammerhead:/ \# cd /proc/27482 1|root@hammerhead:/proc/27482 \# cat maps 12c00000-12e07000 rw-p 00000000 00:04 8519       /dev/ashmem/dalvik-main space (deleted) ... b7712000-b771f000 rw-p 00000000 00:00 0 [heap] bee86000-beea7000 rw-p 00000000 00:00 0 [stack] ffff0000-ffff1000 r-xp 00000000 00:00 0 [vectors] 1|root@hammerhead:/proc/27482 \# ifconfig wlan0     Link encap:Ethernet          inet addr:192.168.12.117          inet6 addr: fe80::8e3a:e3ff:fe5f:64c9/64 1|root@hammerhead:/proc/27482 \# gdbserver –attach :12345 27482 Attached; pid = 27482 Listening on port 12345 [리스트 13] SuperUser 권한으로 gdbserver 실행.hwan@ubuntu:~$ adb forward tcp:23456 tcp:12345 hwan@ubuntu:~$ netstat -an | grep 23456 tcp4       0      0  127.0.0.1.23456         *.*                    LISTEN     [리스트 14] 로컬 포트 23456 으로 원격 포트 12345 를 연결하는 과정.이제 모든 준비가 끝났습니다. 개발 기기에서 gdb로 원격 프로세스에 접근한 뒤, 메모리를 덤프해 봅시다.hwan@ubuntu:~$ ./gdb (gdb) target remote 192.168.12.117:12345 Remote debugging using 192.168.12.117:12345 0xb6f92834 in ?? () (gdb) dump memory /tmp/com.securecompany.secureapp.heap 0x12c00000 0xb771f000 (gdb) [리스트 15] gdb 로 메모리를 덤프하는 과정.덤프한 힙 덤프 파일 속에 있을지도 모르는 문자열을 검색해 봅시다. 그 전에 잠시, 데이터베이스에 사용할 키를 어떻게 처리했었나 되새겨 볼까요? if (savedDbPass.isEmpty()) {        // ...        // String 생성자 사용: 이 문자열은 heap 에 저장된다.        savedDbPass = String(Base64.encode(secretKey, Base64.DEFAULT))    } else {        // decrypt 메소드 내부에서 String 생성자 사용하므로 base64 인코딩된 plaintext 키는 heap 에 저장된다.        savedDbPass = AndroidRsaCipherHelper.decrypt(savedDbPass)    } [리스트 16] Base64 인코딩을 처리하기 위한 임시 String 생성 과정.우리 로직은 256 비트의 키를 Base64 변환해서 디스크에 저장합니다. 그리고 256비트의 byte array 를 base64 변환한 결과는 (4 * (256 / 3)) / 8 = 42.66 바이트 -> 4의 배수여야 하므로 44바이트입니다. 약 1.34 바이트의 pad 를 맞추기 위해 문자열의 끝에 =가 최소 1글자 이상은 있을 겁니다. 한번 찾아봅시다.hwan@ubuntu:~$ strings /tmp/com.securecompany.secureapp.heap ... /masterkey ... user_0/.masterkey em_s 1337 ... [리스트 17] strings 명령을 사용한 힙 덤프 파일내의 문자열 검색의외로 = 나 == 로 끝나는 문자열이 발견되지 않습니다. 하지만 안심하기는 이릅니다. 이건 단순히 (공격자의 입장에서) 운이 나빠서 발견되지 않은 것일 뿐입니다. 우리가 원하는 어떤 ‘순간’ 에 힙 덤프 명령을 내리지 않았기 때문에 그렇습니다. 우리의 구현은 attack surface 를 매우 짧은 시간동안만 메모리에 노출하기 때문에 이 순간이 짧으면 짧을 수록, 디바이스의 성능이 좋으면 좋을 수록 순간을 잡아내기가 더욱 어려워집니다. 즉, 이 문서에서 보여드린 방식으로 CharArray 의 내용을 아주 짧은 시간 동안만 사용하고 지워버리면 내용을 탈취하기 굉장히 어렵습니다. 하지만 안심하기는 이릅니다. nano-time 단위로 앱을 실행할 수 있는 환경을 가진 국가급 공격자는 여전히 있기 때문입니다.그리고 이 방법은 루팅하지 않은 기기에서는 절대 재현이 불가능하므로 루팅되지 않은 환경일 경우에만 실행 가능하도록 한다던가 하는 방식까지 더한다면 공격자가 더욱 우리 앱을 뚫기 힘들 겁니다.여담입니다만 독자 여러분들 중 GameGuardian 처럼 다른 게임의 메모리값을 마구 바꾸는 앱이 어떻게 동작하나 궁금하신 분들도 있을 겁니다. 그런 류의 앱들도 바로, 이 장에서 설명했던 방식으로 동작합니다.장황했던 이 장의 내용을 한줄로 요약하면 Android KeyStore 로 보호하지 않은 키는 많은 수고를 들이면 뚫을 수 있다고 할 수 있습니다.부록 2: SQLite database 의 UPDATE / DELETE 구현 특성SQLite3 의 구현특성상, UPDATE / DELETE 시에 이전 레코드의 값이 남아있는 경우가 있습니다. 암호화 했으니 좀더 안전하다곤 하지만 찌거기 값을 굳이 남겨둬서 공격자에게 더 많은 힌트를 제공할 필요도 없습니다.이 문서는 암호화 구현에만 초점을 맞췄기 때문에 상세하게 다루진 않습니다만, LINE Tech blog에 소개된 True delete 는 이 문제를 해결하기 위한 방법을 제시하고 있으므로 그 문서도 한번 읽어보시길 권합니다.더 보기SQLCipherSafeRoomAndroid SQLite3 True delete - by LINE tech blogDifference between java.util.Random and java.security.SecureRandomAttack surface on security measuresAOSP: DebuggingRootbeer: Simple to use root checking Android library#하이퍼커넥트 #개발 #개발자 #안드로이드 #앱개발 #모바일 #PersistentData #인사이트 #개발후기
조회수 1455

Database를 왜 사용할까요?

개발자들이 Database 프로그램을 선택한 이유Database(이하 DB) 프로그램을 처음 접한 건 Dos에서 사용하는 Database III plus였습니다. 이때는 학생이었기 때문에 프로그램 개발에 관심이 많았지만 대량의 데이터를 다룰 일은 없었습니다. 다음으로 접한 건 clipper였습니다. 과거 C언어를 하던 사람이면 자료 처리를 위해 한 번쯤은 접해봤을 겁니다. 이때까지는 Dos를 주로 사용했고, 간단한 자료를 다루었기 때문에 File 처리만으로도 충분한 결과를 얻을 수 있었죠.그렇다면 DB는 다중 사용자 환경이 되고 바로 사용하게 되었을까요? 예전에 다중 사용자들이 사용했던 걸 꼽자면 PC 통신과 Web이 있을 것입니다. 초창기의 Web은 PHP, ASP가 개발되기 전이었고 Java는 C보다 성능이 낮아 CGI를 C로 구현했으니 게시판이나 자료실 등도 C로 개발했습니다.규모가 큰 PC 통신은 DB를 사용했지만 사설 BBS나 01410 등에 들어가는 외부 업체는 File로 처리했습니다. 이 시기에 사설 BBS나 01410 서비스를 제공하는 업체들은 Workstation을 구입하거나 x86 계열을 구입해 운영체제 (SCO UNIX, Free BSD, Linux 등)를 사용했지만 이때 역시 C로 개발을 했었습니다. 이런 환경에서 점점 File 처리의 한계가 나타나기 시작했던 것이죠.C File lock 예)int iFd, iResult; iFd = open(“LockTest”,O_RDWR);  iResult = lockf(iFd, F_LOCK,10L); /* 필요한 작업 처리 */ close(iFd); 유저가 늘어나고 운영 체제 내부적으로 동시에 처리하는 프로세스가 증가하면서 자료가 깨지는 현상이 나타납니다. 개발자들은 어쩔 수없이 DB를 선택하기 시작했습니다.DB의 장점들DB를 도입하면 여러 가지 장점이 생깁니다. SQL 문장만 익히면 프로그램으로 일일이 구현해야 했던 것들을 명령어만으로 수행할 수 있고 자료의 무결성 또한 보장해 주며, 개발의 생산성까지 높입니다. 만약 특정 날짜의 자료들을 읽어와서 제목 순으로 보여줘야 할 경우, 프로그램으로 개발한 자료를 날짜 별로 읽어 배열에 담고 Quick sort 알고리즘을 적용해 정렬한 후 자료를 보여줘야 합니다. 하지만 DB에서 SQL 문장을 사용하면 간단하게 완성할 수 있습니다. SELECT * FROM TABLE WHERE DATETIME = 날짜 ORDER BY TITLE ; 조심 또 조심!하지만 DB 역시 만능은 아니기 때문에 모든 자료를 처리할 수는 없습니다. 예를 들어 문서(pdf, doc, hwp등) , 이미지(jpg, gif 등), 압축(zip,rar 등) 등의 바이너리 파일입니다. (물론 DB에서 BLOB 자료형을 지원하므로 하드웨어 자원과 성능만 받쳐준다면 불가능한 것은 아닙니다.) 하드웨어 자원과 성능에는 한계가 있기 때문에 DB로 해야 할 일과 하지 말아야 할 일을 구분해야 합니다. 만약 이를 생각하지 않고 DB에 모든 자료를 넣는다면 어떤 문제가 생길까요? 크게 두 가지가 있습니다.첫 번째는 바이너리를 파일을 읽고 쓸 때 발생하는 시간이 문제가 될 수 있습니다. 그 이유는 DB가 Connection Pool로 접속을 관장하는데, 이는 한정된 자원으로 최소한의 시간을 사용해야 많은 유저가 사용할 수 있기 때문입니다. 만약 바이너리 파일을 DB에 올리면서 오랜 시간 접속을 유지한다면 그만큼 다른 유저가 사용할 수 없을 테고, 결국은 DB에서 감당할 수 있는 유저의 수가 줄어들 것입니다.두 번째는 백업의 문제가 있습니다. 우리는 DB에 장애가 발생할 때를 대비해 DB 전체 백업을 합니다. 그런데 DB에 바이너리 파일이 들어가면 백업 시간이 많이 늘어나 원하는 시간 안에 백업을 하지 못하는 일이 발생할 수도 있습니다. 따라서 DB에 바이너리 파일을 넣을 때는 아주 적은 용량의 파일만 넣어야 합니다. 배치에 대하여: OLTP, OLAPDB 용량이 커지면 Query를 수행해도 원하는 결과를 볼 수 없고 DB에 부담을 많이 주는 Query가 발생합니다. 그래서 주기적으로 Query를 돌려 결과를 테이블에 넣고 필요할 때마다 이를 볼 수 있게 배치 처리를 하며 해결합니다. 일, 월, 년 단위의 집계 자료를 구축하면서 시스템에 부하를 줄 수 있기 때문에 보통 야간에 처리를 하죠. 그런데 만약 DB 용량이 너무 커져서 전일자 집계를 배치로 처리하지 못하는 일이 발생하면 어떻게 할까요?여기서 사용할 수 있는 것이 OLAP(OnLine Analytical Processing) DB입니다. 일반적으로 유저가 사용하는 건 OLTP(OnLine Transaction Processing) 입니다. 대표적으로 Oracle, MySQL PostgreSQL 등이 있습니다. 여기서 MySQL 을 제외하고 Oracle과 PostgreSQL 은 Partition, HASH 조인, Parallel을 지원하여 OLAP 환경에서도 어느 정도 사용 가능합니다.OLAP DB는 주로 DW 환경에서 사용하며 대표적으로 Teradata와 Oracle Exadata 등이 있습니다. OLAP DB 와 비교가 안 될 정도를 빠르게 배치 작업을 처리할 수 있습니다. (자세한 내용은 다음 글에서 설명하겠습니다.)Conclusion지금까지의 이야기를 정리하면 ‘여러 유저가 동시에 안정적으로 자료 처리를 하려면 DB를 사용하고, 자료의 양과 처리 형태(OLAP, OLTP) 에 따라 DB를 선택하면 된다’는 것이었습니다. 자세한 설명을 하자면 각 DB별 특성을 기술해야 하기 때문에 오늘은 전체적인 내용부터 살펴봤습니다. 다음 글에서는 유저가 사용하는 OLTP에 대해 살펴보겠습니다. 글한석종 부장 | R&D 데이터팀hansj@brandi.co.kr#브랜디 #개발문화 #개발팀 #업무환경 #인사이트 #경험공유
조회수 1451

PyCon2017 첫번째날 후기

아침에 느지막이 일어났다. 어제 회사일로 피곤하기도 했지만 왠지 컨디션이 좋은 상태로 발표를 하러 가야지!라는 생각 때문에 깼던 잠을 다시 청했던것 같다. 일어나 아침식사를 하고 아이 둘과 와이프를 두고 집을 나섰다. 작년 파이콘에는 참가해서 티셔츠만 받고 아이들과 함께 그 옆에 있는 유아교육전을 갔었기에 이번에는 한참 전부터 와이프에게 양해를 구해둔 터였다.코엑스에 도착해서 파이콘 행사장으로 가까이 가면 갈수록 백팩을 메고, 면바지를 입고, 영어 글자가 쓰인 티셔츠를 입은 사람의 비율이 높아지는 것으로 보아 내가 제대로 찾아가고 있구나 라는 생각이 들었다.늦게 왔더니 한산하다.지난번에는 입구에서 에코백과 가방을 나눠줬던 것 같은데 이번에는 2층에서 나눠준다고 한다. 1층이 아무래도 복잡해지니 그런 것 같기도 하고, 2층에서 열리는 이벤트들에도 좀 더 관심을 가져줬으면 하는 것 같기도 하다. 우선 스피커 옷을 받고 싶어서 (솔직히 입고 다니고 싶어서) 2층에 있는 스피커방에 들어갔다.허락 받지 않고 사진찍기가 좀 그래서 옆방을 찍었다첫 번째 키노트는 놓쳤지만 두 번째 키노트는 꼭 듣고 싶었기에 간단히 인사만 하고 티셔츠를 들고 나왔다. (외국에서 오신 연사분과 영어로 대화를 나누고 있어서 자리를 피한것은 아니다.) 나가는 길에 보니 영코더(초등학교 5학년 부터 고등학생 까지 파이썬 교육을 하는 프로그램)을 진행하고 있었다. 의미있는 시도를 하고 있다는 생각이 들었다.이 친구들 2년 뒤에 나보다 잘할지도 모른다.키노트 발표장에 갔더니 아웃사이더님이 뒤에 서 게셨다. 지난 파이콘 때 뵙고 이번에 다시 뵈었으니 파이콘이 사람들을 이어주는 역할을 하는구나 싶었다.키노트에서는 현우 님의 노잼, 빅잼 발표 분석 이야기를 들을 수 있었다. 그리고 발표를 통해 괜히 이것저것 알려줘야만 할 것 같아 발표가 부담스러워지는 것 같다는 이야기를 들었다. 나 또한 뭔가 하나라도 지식을 전달해야 한다는 압박감을 느끼고 있었던 터라 현우 님의 키노트 발표를 듣고 나니 좀 더 오늘을 즐겨야겠다는 생각이 들었다.오늘은 재미있었습니다!현우님 키노트를 듣고 같은 시간(1시)에 발표를 하시는 경업님과 이한님 그리고 내일 발표이신 대명님, 파이콘 준비위원회를 하고 계신 연태님과 함께 식사를 하러 갔다. 가는 길에 두숟갈 스터디를 함께 하고 계신 현주님과 희진 님도 함께했다. 사실 이번에는 발표자도 티켓을 사야 한다고 해서 조금 삐져 있었는데 양일 점심 쿠폰을 주신다고 해서 삐진 마음이 눈 녹듯이 사라졌다.부담 부담식사를 하고 발표를 할 101방으로 들어가 봤다. 아직 아무도 없는 방이라 그런지 괜히 긴장감이 더 생기는 느낌이다. 발표 자료를 열어 처음부터 끝까지를 한번 넘겨 보고 다시 닫았다. 처음에는 가장 첫 발표라 불만이었는데 생각해보니 발표를 빨리 마치고 즐기는 게 훨씬 좋겠다는 생각이 들었다. 발표 자료를 다듬을까 하다가 집중이 되지 않아 밖으로 나갔다. “열린 공간” 현황판에 충동적으로 포스트잇을 하나 붙이고 왔다. 어차피 발표는 나중에 온라인으로도 볼 수 있으니까 사람들과 이야기를 나눠 봐야 겠다 싶었다. (내 발표에는 사람이 많이 왔으면 하면서도, 다른 사람의 발표는 온라인으로 보겠다는 이기적인 생각이라니..)진짜 궁금하긴 합니다다시 발표장으로 돌아왔다. 왠지 모르는 분들은 괜찮은데 아는 분들이 발표장에 와 계시니 괜히 더 불안하다. 다른 분들은 발표자료에 짤방도 많이 넣으셨던데.. 나는 짤방도 없는 노잼 발표인데.. 어찌해야 하나. 하지만 시간은 다가오고 발표를 시작했다.얼굴이 반짝 반짝리허설을 할 때 22분 정도 시간이 걸렸던 터라 조금 당겨서 진행을 했더니 발표를 거의 20분에 맞춰서 끝냈다. 그 뒤에 몇몇 분이 오셔서 질문을 해주셨다. 어리버리 대답을 한 것 같다. 여하튼 내 발표를 찾아오신 분들께 도움이 되었기를. 그리고 앞으로 좀 더 정확한 계산을 하시기를.대단히 발표 준비를 많이 하지도 못하면서 마음에 부담만 쌓아두고 있는 상황이었는데, 발표가 끝나니 아주 홀가분한 마음이 되었다. 발표장을 나가서 이제 부스를 돌아보기 시작했다. 매해 참여해 주고 계신 스마트스터디도 보이고 (정말 안 받고 싶은 ‘기술부채’도 받고 말았다.) 쿠팡, 레진 등 친숙한 회사들이 많이 보였다. 내년에는 우리 회사도 돈을 많이 벌어 여기에 부스를 내고 재미있는 이벤트를 하면 좋겠다는 생각이 들었다.부스를 돌아다니다가 이제 파이콘의 명물이 된 내 이름 찾기를 시작했다. 이름을 찾기가 쉽지가 않다. 매년 참여자가 늘어나서 올해는 거의 2000명에 다다른다고 하니 파이썬 커뮤니티의 성장이 놀랍다. 10년 전에 파이썬을 쓸 때에는 그리고 첫 번째 한국 파이콘이 열릴 때만 해도 꽤 마이너 한 느낌이었는데, 이제 주류가 된 것 같아 내 마음이 다 뿌듯하다. (그리고 내 밥줄이 이어질 수 있는 것 같아 역시 기쁘다)어디 한번 찾아보시라다음으로는 박영우님의 "Django admin site를 커스텀하여 적극적으로 활용하기” 발표를 들으러 갔다. (짧은 발표를 좋아한다.) 알고 있었던 것도 있었지만 커스텀이 가능한지 몰랐던 것들도 있어서 몇 개의 기능들을 킵해 두었다. 역시 컨퍼런스에 오면 내게 필요한 ‘새로운 것’에 대한 실마리를 주워가는 재미가 있다.익숙하다고 생각했지만 모르는것이 많다4시가 되어 OST(Open Space Talk)를 하기로 한 208B 방으로 조금 일찍 갔다. 주제가 뭐였는지는 잘 모르겠는데 주식 투자, Tensor Flow, 비트코인, 머신러닝 등등의 이야기들이 오가고 있었다. 4시가 되어 내가 정한 주제에 대해 관심 있는 사람들이 모였다. 괜히 모일 사람도 없는데 큰방을 잡은 것이 아닐까 하고 생각하고 있었는데, 생각보다 많은 분들이 오셨다.각 회사들이 어떤 도구를 사용하는지 설문조사도 해보고, 또 어떤 개발 방법론을 사용하는지, 코드 리뷰, QA는 어떻게 하고 있는지에 대한 이야기를 나눴다. 다양한 회사에서 다양한 일을 하는 사람들이 모여 있다 보니 생각보다 꽤 재미있게 논의가 진행되었다. 사실 내가 뭔가 말을 많이 해야 할 줄 알았는데, 이야기하고 싶은 분들이 많이 있어서 진행을 하는 역할만 하면 되었다. 마지막으로는 “우리 회사에서 잘 사용하고 있어서 다른 회사에도 추천해 주고 싶은 것”을 주제로 몇 가지 추천을 받은 것도 재미가 있었다.열심히 오간 대화를 적어두긴 했다5시에 OST를 마치고는 바로 집으로 돌아왔다. 오늘 저녁에 아이들을 잘 돌보고 집 청소도 열심히 해두어야 내일 파이콘에 참여할 수 있기 때문이다. 기대된다. 내일의 파이콘도.그리고 정말 감사드린다. 파이콘을 준비해주시고 운영해주고 계신 많은 분들께.#8퍼센트 #에잇퍼센트 #개발자 #개발 #파이썬 #Python #파이콘 #Pycon #이벤트참여 #참여후기 #후기
조회수 1013

영원했으면 하는 행복한 세계 : 김현주 TA

ㅡ더 즐겁고 다 행복한영원했으면 하는 행복한 세계 :서서울예술교육센터 김현주TA#서서울예술교육센터 #김현주TA#과일파라다이스‡ Nice to meet you, Artist meets you ! ‡서울에서 활동하는 예술가들이 만들어내는 창의적인 예술 활동. 서울문화재단의 15개 창작공간 입주작가들을 소개합니다.영원했으면 하는 행복한 세계김현주 작가의 피치파라다이스(2018)‘과일나라, 즐거운 놀이터’라는 테마로 서서울예슐교육센터의 TA로 활동하며, 과일파라다이스 시리즈 작업으로 즐거운 에너지를 전달하고 있는 김현주 작가. 그녀의 작품 이름인 ‘과일파라다이스’만큼, 그녀와 작품에 관한 풍성한 궁금증을 해소하기 위해 지난 9월 한성대 입구에 위치한 작업실에서 김현주 작가를 만났다. 그녀가 그려내는 ‘행복한 세계’는 무엇일까?서서울예술교육센터 김현주 TA인터뷰 전 살펴본 작가의 포트폴리오를 보면서 놀랄 수밖에 없었다. 젊은 나이임에도 불구하고 이미 개인전과 단체전을 통한 다양한 전시 경험을 했다는 사실과 탐스럽고 풍요롭게 보이는 그의 작업물인 ‘과일 파라다이스’ 때문이었다. 전시 작품 사진만으로도 과일을 통해 무릉도원을 만난 것처럼 긍정적인 에너지를 느낄 수 있어 작가가, 작가의 작품이 기대됐다. 예상대로 그 에너지는 그림에만 있지 않았다. 직접 만난 김현주 작가는 ‘과일 파라다이스’처럼 행복한 기운을 전달하는 사람이었다.과일파라다이스’라는 주제로 예술활동을 하고 있습니다김현주 작가의 그림과 작업물은 전부 ‘과일’이 들어가거나 혹은 과일을 모티브로 구현한 것이다. 과일을 상상만 해도 즐겁고 행복하다는 그녀는 사람들에게 즐거운 에너지를 전달하는 것이 그녀가 작품 활동을 하는 목적이기에 스스로 긍정적인 에너지를 받는 과일로 그것을 구현하고 있다고 한다. 사실 과일을 싫어하는 사람은 그리 많지 않겠지만 그것을 예술작품으로 구현하는 것에는 또 다른 이유가 있을 것이라 생각했다. 한 번 더 질문했다. ‘도대체 왜 과일입니까?’과일 파라다이스-사랑(2017), 작업실에서 촬영김현주作, PEACH PARADISE-island, 비단에 채색, 97 x 97 cm, 2017과일색이 주는 매력, 나는 색 수집가김현주 작가를 매료시킨 것은 바로 과일의 색상이다. 자신을 색 수집가로 일컬을 정도로 과일의 색을 좋아하고 작품을 시작할 때도 원하는 색을 추출하는 과정이 최우선이다. 머릿속에 상상하는 색깔이 구현될 때까지 이 작업은 계속된다. 예를 들어 풍요로움이 떠오른다면 오렌지가 그러한 색상이고 보석을 캐는 느낌을 구현하고 싶을 때는 루비와 같은 석류 열매와 비슷한 색을 추출하면서부터 하나의 작품이 시작되는 것이다. 평소에도 많은 제철 과일들을 사 먹는데 먹고 나서 즉석에서 색을 추출하거나 그것에 대한 느낌을 그림으로 표현하는 경우도 많다고 한다. 그녀에 관한 궁금증은 자연스럽게 색을 추출하는 과정에 대한 궁금증으로 이어졌다.김현주作, POMEGRANATE PARADISE, 비단에 채색, 자개, 72.7x53cm, 2017비단 위에 그려내는 아름다운 과일파라다이스동양화를 전공한 김현주 작가는 동양화의 기법과 미학에 매료되었는데 특히 우리나라와 중국, 일본의 산수화에서 느껴지는 웅장함과 깊이가 자신이 상상하는 예술적인 정서와 일치하는 점이 많았기 때문이다. 이러한 관심은 과일파라다이스의 작업물의 제작방식으로도 이어졌다. 모든 그림은 종이가 아닌 비단 위에서 그려진다. 단순히 화폭이 비단인 게 아니라, 한국전통재료와 방식을 그대로 따르는 ‘전통 진채’ 방식을 활용한다. 고운 비단을 골라 나무틀에 씌우고 정성 들여 만든 교반수(물과 아교와 백반을 섞은 것)로 앞뒷면을 칠해 자연 바람으로 말린다. 그런 후에 비단에 먹선으로 스케치를 하고 그 뒤에 추출한 안료에 아교풀을 섞은 것으로 채색하여 작품을 완성하는 것이다. 색을 추출하기 위해서는 자연에서 추출한 다양한 원재료를 배합하는데 상당히 시간이 걸리면서도 구하기 힘든 소재인 관계로 엄청난 정성이 들어가는 것이다.과일파라다이스의 화폭인 비단교반수를 통한 작업을 설명 중색을 뽑아내는 주요 원료들색을 추출하는 김현주 작가추출중인 레몬색김현주, 피치파라다이스-금궤도, 72.7x60.6cm, 비단에 채색, 금, 2018즐거운 예술을 전달하고자 하는 TA활동김현주 작가는 현재 서서울예술교육센터에서 ‘과일나라 즐거운 놀이터!’라는 시각예술교육을 진행하고 있다. 초등학생과 중학생 그리고 성인을 대상으로 하고 있다. 학생들의 경우 한지의 특성을 활용하고 과일을 통해 상상의 재미를 구현하는 데 중점을 두고 있는 한편, 성인을 위해서 공예(피경지TA)와 한국화를 결합해 공동 제작한 “공예와 한국화의 콜라보 : WHITE& COLOR PARADISE”와 작가 본인의 과일파라다이스와도 관련이 있는 ‘비단에 담아보는 행복한 색’이라는 프로그램을 진행한다. 김현주 작가는 TA활동을 자신의 예술 활동과 분리하지 않고, 또 하나의 작업으로 생각한다. 탐스러운 과일에서 에너지를 받아 과일파라다이스를 그려내듯이, 일상에 지친 성인들도 오롯이 자신만의 상상을 비단에 담아 행복한 에너지를 발산하는데 도움을 주고자 한다. 또 그는 TA활동 이전에도 즐거운 에너지를 직접 체험을 통해 전달할 수 있는 전시를 개최하기도 했다.TA활동은 예술의 또 다른 형태라는 김현주 작가당신의 파라다이스는 무엇인가요.Feel Paradise!포트폴리오를 보면서 김현주 작가의 그림만큼이나 흥미를 끌었던 것은 바로 2017년에 열린 개인전 <색, 향을 담다>이다. 전시회에서 예술작품을 일방적으로 관람하는 경우가 많은데 <색, 향을 담다>에서는 과일파라다이스에 대한 상상력을 관객들과 공유하고 김현주 작가 역시 관객에게서 에너지를 얻게 되는 체험형 전시였다. 한 가지 예로 작품 ‘감각 파라다이스’를 살펴보자. 이 작품은 설치형 작품으로 과일들이 펼쳐진 테이블 위에는 진짜 과일과 가짜 과일이 섞여 있는데 진짜는 실제, 가짜는 상상의 파라다이스를 의미한다. 현실과 상상이 혼재된 공간에서 관객들의 반응을 통해 새로운 아이디어를 얻음과 동시에 현실과 상상의 경계에서 가상의 파라다이스를 그려보는 작업을 관객과 작가가 할 수 있는 것이다.감각 파라다이스(2017)김현주 작가님의 파라다이스는 무엇인가요?마지막으로 제일 기다렸던 질문을 했다. 과일 파라다이스 속에 담긴 김현주 작가의 진심이 궁금했기 때문이다. 잠깐 고민을 한 뒤 ‘영원했으면 하는 행복한 세계’라는 조금은 수줍은, 하지만 명쾌한 고백이 이어졌다. 작업실에 걸려있던, 그리고 작업 중이던 과일 파라다이스의 그림을 좀 더 살펴보니 그 이유를 알 수 있을 것 같았다. 풍요로운 과일뿐만이 아니라 그녀가 사랑하는 반려견(코코), 사랑했던 반려견(재롱이), 그리고 그리워하는 인물이 과일파라다이스 속에 담겨있었다. 앞으로도 김현주 작가는 과일파라다이스를 통해 관람객들과 호흡하는 예술을 희망하고 있으며 과일파라다이스 전시와 함께 필 파라다이스를 모티브로 하는 대안전시를 진행할 예정이다. 김현주 작가의 과일 파라다이스를 통한 행복한 에너지를 공유할 사람이 더욱더 많아지길 희망하면서, 그리고 과일 파라다이스의 팬이 되어버린 나를 발견할 수 있는 시간이었다.과일파라다이스를 유심히 보면 만날 수 있는 작가의 반려견영원했으면 하는 행복한 세계, 김현주 작가의 파라다이스*김현주 작가는 10월 3일과 10일에 걸쳐 DDP에서 ART Mining Seoul 2018에서 과일파라다이스의 작품 일부를 전시하였으며, 10월 2일부터 11월 6일까지 한남동 Poing 사옥에 위치한 JY art gallery X bo!ua에서 라는 이름으로 개인전을 진행하고 있다. 아트마이닝 2018에 전시된 과일파라다이스 작품중 일부글  시민기자단 박경호사진제공  김현주디자인  이한솔#서울문화재단 #문화예술지원 #TA업무 #직무정보 #예술작가 #인터뷰 #공채정보 #서서울예술센터
조회수 2191

같은 크기가 달라보이는 이유, 시각적 보정 이해하기

여기 크기를 맞춘 도형 조합 A, B가 있습니다. A, B 중 사각형과 원의 크기 비율이 같아 보이는 조합은 무엇인가요?  저는 B조합이 훨씬 더 자연스럽게 보입니다. A는 가로 세로 크기를 똑같이 맞췄으며, B는 상대적으로 면적을 고려해 원형의 크기를 사각형보다 조금 더 크게 그렸습니다. 이처럼 사람의 눈에 자연스럽게 보이도록 조정하는 작업을 ‘시각적 보정’이라고 합니다. 디자이너, 혹은 디자이너가 아닌 사람들도 다양한 프로그램을 통해 미세한 크기를 똑같이 맞출 수 있습니다. 하지만 프로그램이 오브젝트를 인식하는 것과 사람이 보는 것은 다르기 때문에, 때론 아주 정확한 것이 부자연스럽게 보일 수 있습니다. 서로 다른 형태 사이의 차이점을 보완해주는 작업이 필요합니다.  최근 저는 이러한 시각적 보정에 대해 요목조목 잘 정리된 루크 존스(Luke Jones)의 “Optical Adjustment”를 읽었습니다. 여기에 몇 가지 추가 사례를 덧붙여 함께 소개합니다. (“Optical Adjustment”의 원문 번역글은 강수영님의 “시각적인 보정”에서 확인할 수 있습니다.)1. 도형에 따른 크기 조정하기앞서 살펴본 원과 사각형의 크기 조절부터 다시 볼까요? 사방 80pixel의 영역 안에서 사각형은 원보다 넓은 면적을 차지합니다. 우리 눈은 사방 길이를 통해 크기를 인식하기 보다는, 면적을 보고 어림잡아 비슷한 크기를 가늠합니다. 사각형보다 원의 크기를 조금 더 크게 그려주면 비교적 두 도형의 크기가 동일해 보입니다.2. 시각적 무게 중심 고려하기시각적 무게 중심에 따른 정렬은 플레이 버튼 아이콘을 통해서 해볼 수 있습니다. 원형과 삼각형을 중앙 정렬하면 A 아이콘처럼 됩니다. 중앙에서 빗겨나 있는 것처럼 보이는데요, 이는 삼각형의 무게 중심이 원형의 중심과 맞지 않아서 그렇습니다. 이렇게 서로 다른 형태의 오브젝트를 정렬할 때는 무게 중심을 고려하여 B 아이콘처럼 수정해주는 것이 좋습니다.3. 면적 대비 색상 조정하기면적에 따라서 색상의 무게감이 달라집니다. A는 파란 아이콘에 비해 텍스트 컬러가 살짝 연해 보입니다. 이렇게 넓은 면적과 비교적 좁은 면적(텍스트/라인)에 같은 색상이 쓰이는 경우가 많습니다. 이럴 때 좁은 면적의 컬러를 조금 더 짙게 수정해주면 면적의 넓이와 상관없이 (비교적) 동일한 색상으로 인지됩니다.3. 형태를 고려해 오브젝트 정렬하기이번에는 슬로워크에서 디자인한 DMZ국제다큐영화제 시그니처를 예시로 정렬을 살펴보겠습니다. 자세히 보면 시그니처의 우측 가장자리에 ‘~제' 로 끝나는 첫줄과 ‘-29.’로 끝나는 마지막줄이 있습니다. 온점은 한글보다 공백을 많이 포함하고 있습니다. 그래서 A처럼 정직하게 정렬하면 마지막줄만 움푹 들어간 것 처럼 보입니다. 이를 B처럼 튀어나오게 수정해주는 것이 보기에 자연스럽습니다.  4. 명도에 따라 굵기 조정하기4번의 컬러 조정과 같은 맥락으로, 오브젝트의 명도에 따라 굵기가 달리 보일 수 있습니다. 좌측의 흰색 텍스트와 우측 상단 검은색 텍스트(굵기 조정 전)는 같은 굵기의 폰트입니다. 검은색 텍스트가 상대적으로 가늘어 보여서 조금 더 굵게 수정했습니다. 네거티브, 포지티브 적용을 동시에 할 때 이런 점을 고려하곤 합니다.5. 영문폰트와 한글폰트 조합시 조정하기한글폰트와 영문폰트를 조합해서 디자인하는 경우가 많습니다. 편집디자인 툴인 인디자인 프로그램에는 ‘합성글꼴’이라는 기능이 있어 숫자, 영문, 국문, 기호 등을 각각 다른 폰트로 지정하고 세세하게 크기도 다르게 할 수 있습니다. 서로 다른 폰트를 억지로 이어붙이는 것이기 때문에, 크기값이 같아도 한글폰트가 더 커보입니다.(좌측 텍스트) 이때 크기와 높낮이를 직접 조정해주는 것이 좋습니다.(우측 텍스트)6. 커닝(글자 간격 조정)하기왼쪽 텍스트를 자세히 들여다보면 글자의 각기 다른 모양 때문에 배열이 균등하지 않아 보입니다. 이때 글자의 형태를 고려해 적당한 간격으로 보이도록 수정하는 것을 커닝(kerning)이라고 합니다. 커닝은 상대적으로 공백을 많이 가진 글자(숫자 1, 알파벳 A, W, V)일수록 조정을 필요로 합니다. 디자인을 전공하면 가장 기초적으로 배우는 부분임에도, 저는 커닝을 완벽히 하는 것이 제일 어렵습니다.커닝을 연습할 수 있는 사이트도 있습니다. 완성도에 따라 점수도 매겨줍니다. 간단하게 여러분의 눈썰미가 얼마나 날카로운지 확인해보세요. -> 커닝 해보기참고: Luke Jones - Optical Adjustment#슬로워크 #스티비 #디자인팀 #디자이너 #꿀팁
조회수 953

스타트업은 뭘 해도 욕을 먹는다

얼마 전 재미있는(& 공감되는....) 바이럴 영상 하나를 봤다.통통한 여자 BJ에게 누군가 키가 작고 통통한데 치마를 입어도 되겠냐고 질문을 하자, "살이 찐 사람들은 뭘 입어도 욕해요. 뚱뚱한 사람이 바지를 입으면 아 저렇게 뚱뚱한 애들은 치마를 입어야 허벅지가 덜 두꺼워보이는데 막 이러구요, 치마를 입고 돌아다니면 저 다리로 왜 치마를 입고 있어 이러구요, 검은색 달라붙는 티를 입으면 뚱뚱한 애가 왜 저렇게 달라붙는 티를 입고 있어 이러구요, 또 막 박스티나 흰색 티를 입으면 뚱뚱한 애들은 검은색 달라 붙는 옷을 입어야 말라보이지 막 이러구요. 그냥 무조건 욕을 먹거든요 뭘해도, 그냥 입으세요. 당당하게" 참 웃픈 현실이 아닐 수 없다 (영상링크: 뚱뚱한 사람들은 어디 서러워서 옷 입고 다니겠나)그런데 요즘 들어서는 좀 다른 의미에서 괜히 와닿는다.스타트업 또한 뭘 해도 욕을 먹는다놀면 논다고, 일하면 바쁜 척 한다고, 힘들어 하거나 고민하면 그러게 그렇게 힘든 걸 왜 하고 있냐고, 즐겁게 지내고 있으면 생각이 없다고, 실패하면 그럴 줄 알았다고, 이런 과정을 다 거쳐서 오랜 시간 끝에 지분율따라 큰 성취를 거두면 욕심 많고 이기적이라고, 다 그런건 아니지만 그런 소리를 누구에게든 꼭 한 번씩은 듣게 마련이다. 모두를 만족시킬 수는 없다.Haters hate, doubters doubt. 그러니 바깥 소리에 너무 신경쓰지 말고 자기 주관대로 제 갈 길을 가는 것이 옳다.스스로에게 당당할 수 있으면 된다.#라이비오 #스타트업 #마인드셋 #운영 #인사이트 #경험공유
조회수 463

올바른 크리에이티브 디렉터, 이시우

   올바른 크리에이티브 디렉터, 이시우 믹픽인사이드는 믹스앤픽스와 함께 성장하고 있는 구성원들의 이야기를 들어보는 시리즈입니다. 다양한 분야의 사람들이 모인 만큼 풍부한 이야기가 완성되었는데요. 각각의 개성들이 꿈을 향해 달려온 시간, 믹픽과 함께 나아갈 시간에 대해 나누며 우리가 하고 싶은 일로 꾸려나가는 회사를 그려봅니다.                Q1. 간단한 자기소개 부탁드립니다.  안녕하세요. 크리에이티브 디렉터이자 콘텐츠 기획자 이시우입니다.    Q2. 어떤 분야에서 크리에이티브 디렉터로 활동을 하신 건가요?  사람들의 감정을 일러스트로 표현하는 작업을 했어요. 열등감, 연인과의 관계, 친구 관계 등 다양한 주제를 작품에 담았죠.    Q3. SNS에 작품을 적극적으로 공유하시더라고요. 네. 제가 작업한 작품들을 페이스북 페이지와 인스타그램에 올리고 있어요. 중학교 때 기발한 인쇄광고를 보고 꿈을 가졌었는데 대학교 2학년 때 일러스트를 배우면서 본격적으로 시작하게 됐고요.    Q4. 작업물 중에서도 가장 애착이 가는 작품이 있을 것 같아요.  사람 혀에 목을 매달고 있는 작품이요. 그 당시 말 때문에 힘들어하는 친구들을 보며 그렸는데 말 한마디에 누군가 죽을 수 있다는 걸 표현하고 싶었어요. 당시에 제 페이스북 페이지에 올려서 좋아요 10만 개를 받았고, 그때를 계기로 본격적으로 작업을 하게 됐죠.    Q5. 사회적 이슈를 다루거나 공익성이 짙은 작업들이 눈에 띄더라고요.  네. 실제로 ‘공공옵티컬’이라는 예술단체에서 공공디자인 프로젝트를 진행하기도 했어요. 횡단보도 바닥에 ‘스마트폰 정지선’을 설치했고 사라져 가는 점자 블록을 되찾기 위한 옥외광고를 기획했죠.    Q6. 작가로서 기억에 남았던 일 한가지가 있다면? ‘부산 여중생 폭행사건’에 대한 일러스트를 그렸었어요. 중학생이 저질렀다기엔 믿을 수 없을 만큼 폭행의 정도가 컸지만, 피의자들에겐 다음엔 그러지 말라며 사건이 종결됐죠. 사람을 죽도록 때려 놓고 ‘참 잘했어요.’ 도장 찍어주듯이. 이 작품을 본 실제 피해자 친구가 청원 용도로 써도 되냐며 연락이 왔고 제 그림과 함께 청원이 올라갔었어요.    Q7. 광고를 기획하면서 계속해서 아이디어를 내는 일이 쉽진 않을 것 같아요. 개인 작업을 해오다 보니 틀에 얽매이지 않고 자유롭게 생각하는 편이에요. 그래서 광고를 기획할 때 상업적인 가이드 라인이 있더라도 그 경계를 넘나들어 튀는 아이디어들을 내고 있죠.    Q8. 앞으로의 계획을 말씀해주세요 제가 원하는 광고 회사에 들어왔으니 광고 기획에 좀 더 집중하고 싶어요. 특히 소셜미디어 콘텐츠를 사람들에게 효과적으로 전달하는 방법들을 연구하고 싶어요. 개인 작업도 시간이 되는대로 짬짬이 그려야죠.   
조회수 906

우리 고객의 다른 브랜드 소비 행태를 알아야 하는 이유 | Shared Customer Seminar

우리 고객의 다른 브랜드 소비 행태를 알아야 하는 이유– 오픈서베이 Shared Customer Seminar 주요 내용 정리우리 브랜드 고객의 소비 행태를 여러분은 얼마나 알고 있나요? 우리 브랜드 고객의 소비 행태를 파악하는 일도 쉽지 않지만, 우리 브랜드에서 일어난 소비는 고객의 전체 소비 중 많아봤자 1%일 뿐입니다. 모든 고객은 여러 카테고리에 걸쳐 다양한 브랜드를 소비하기 때문이죠. 다시 말해 나머지 99%를 알지 못한다면 고객의 전체 소비 행태를 파악할 수 없다는 의미입니다.그렇다면 우리 브랜드를 포함한 고객의 전체 소비 행태를 아는 방법이 궁금해집니다. 오픈서베이는 지난 7월 4일, 위 고민을 해소할 방법을 공유하는 ‘쉐어드 커스터머(Shared Customer)’ 세미나를 개최했습니다. 그간 수집한 매장 방문 및 구매 데이터를 기반으로 소비자의 교차 구매와 교차 방문을 분석한 결과를 공개한 겁니다. 본 글은 세미나 내용 요약과 현장 스케치로 구성됩니다.* 아래는 오픈서베이 황희영 대표의 발표 중 일부를 옮겨적은 내용입니다.Shared Customer 세미나 발표를 맡은 오픈서베이 황희영 대표(사진. 오픈서베이) | 내 고객 데이터가 말해주지 않는 것“아리따움에서 지난 3개월 동안 비슷한 금액을 소비한 두 고객에게 같은 마케팅 메시지를 보낼 수 있을까?” Shared Customer 세미나 주제의 핵심은 이렇게 요약할 수 있습니다. 두 고객은 같은 기간 각각 6,000원, 3,500원만큼의 지출을 했는데요. 같은 1 만원 이하 지출 고객이라도 아리따움에서 적게 쓴 이유는 다를 수 있기 때문입니다. 아리따움은 1만 원 이하 저 지출 고객에 대해 기본적으로 3가지 가설을 세울 수 있습니다.1. 소비 여력 자체가 적은 경우2. 뷰티 카테고리의 소비 여력/관심이 적은 경우3. 소비 여력도 있고 뷰티 관심도 있지만 아리따움에서의 소비가 적은 경우위 3가지 중 고객이 어떤 가설에 해당하는지에 따라 마케팅 메시지는 각기 달라져야 합니다. 문제는 아리따움이 알 수 있는 데이터는 두 사람의 아리따움 내 소비 행태뿐이라는 겁니다. 이것만으로는 두 고객 중 소비 여력 자체가 적은 지, 뷰티 카테고리에 관심이 없는지, 타 뷰티 매장을 주로 이용하는지 등 어떤 가설에 해당하는지 알 수 없다는 거죠. 즉, 고객에게 알맞은 마케팅 활동을 할 수 없다는 겁니다.그럼 두 고객의 타 브랜드 소비 행태를 알 수 있다면 어떨까요? 사실 위 데이터는 오픈서베이가 조사한 두 패널의 3개월간 지출 내역입니다. 아리따움은 물론 뷰티 카테고리 내 다른 브랜드 지출 정보와 타 카테고리까지 걸친 전체 소비 행태를 알 수 있습니다. 아리따움 내부 데이터만으로는 알 수 없는 아리따움 고객의 전체 소비 행태 데이터죠. 아래 표를 함께 보겠습니다.  아리따움에서 1만원 이하 지출하는 소비자 A, B의 전체 소비 행태 데이터(자료 중 일부)편의상 왼쪽 소비자를 A, 오른쪽을 B라 지칭하겠습니다. A는 미샤에서 약 16만 원, 올리브영에서 약 10만 원, 토니모리에서 4만 4천 원을 써서 3개월간 뷰티 관련 총 34만 원을 지출했습니다. 반면 B는 아리따움 외 에뛰드하우스에서 4,800원을 지출해 뷰티에서 총 8,300원을 소비했습니다.이렇게 두 소비자의 뷰티 카테고리 전체 지출은 34만 원과 8,300원으로 큰 차이가 있다는 걸 알 수 있습니다. 자연스럽게 A는 소비 여력도 있고 뷰티 제품에 대한 관심도 있지만 아리따움에서의 소비가 적은 경우인 3번째 가설을 적용할 수 있게 됩니다.다음으로 B에게 맞는 가설을 찾기 위해 타 카테고리 지출 내역도 살펴보겠습니다. 타 카테고리에서도 두 소비자의 소비 행태는 달랐습니다. A는 뷰티 및 미용 관련으로 94만 원 지출한 걸 포함해 3달간 총 580만 원을 소비했는데, B는 온라인 쇼핑 33만 원 등 3달간 총 140만 원을 지출했습니다. 이를 통해 B는 소비 여력 자체가 적고 특히 뷰티 카테고리의 관심도가 적은 1, 2번 가설임을 확인할 수 있습니다.이렇듯 다른 매장 구매 내역을 분석해 두 소비자에게 각기 다른 마케팅 메시지를 적용해야 한다는 걸 알기까지는 자사 브랜드의 고객 데이터는 물론 고객의 타 브랜드 소비 데이터를 함께 분석해야 한다는 걸 알 수 있습니다. 이러한 개념을 바로 ‘Shared Customer’라 부릅니다. | 우리 고객의 타 브랜드 소비 행태를 안다면그럼 우리 브랜드 고객의 교차 방문 및 교차 구매 데이터는 그저 소비자를 좀 더 잘 이해하기 위해서만 필요한 걸까요? Shared Customer 데이터는 브랜드 운영에 있어서 강력한 무기가 됩니다. 특히 동일 카테고리 내, 서로 다른 카테고리 간, 그리고 온·오프라인 채널 간 Shared Customer 분석은 브랜드 차원에서 크게 세 종류의 의사결정에 활용할 수 있습니다.Shared Customer 분석 활용법 3가지(자료 중 일부) | ① 동일 카테고리 내 분석첫 번째는 동일 카테고리 내 Shared Customer 분석입니다. 이는 한 소비자의 특정 카테고리 내 전체 지출 중 우리 브랜드 지출이 차지하는 비중을 알기 위해 쓰이는 ‘지갑 점유율, 쉐어오브월렛(Share of Wallet)’이라는 개념으로도 알려져 있습니다.이를 통해 아리따움에서 지출이 많을수록 구매 빈도가 함께 오르는 뷰티 브랜드를 알 수 있습니다. 반대로 아리따움과 상반된 관계를 갖는 브랜드도 있습니다. 이렇게 보완 브랜드와 경쟁 브랜드를 명확히 인지한다면 카테고리 내 방어 및 확장 전략을 자세히 수립할 수 있습니다.참고로 Shared Customer 데이터에 따르면 아리따움과 보완 관계에 있는 브랜드는 에뛰드 하우스, 경쟁 관계의 브랜드는 올리브영으로 나타났습니다. 즉, 올리브영을 제외하면 모든 뷰티 매장이 아리따움과 직접적인 경쟁 관계는 아니라는 것이죠.3개월 간 아리따움 구매 금액별 뷰티 매장 Shared of Wallet(자료 중 일부) | ② 서로 다른 카테고리 간 분석두 번째는 서로 다른 카테고리 간 Shared Customer 분석입니다. 이를 통해서는 내 브랜드 고객의 취향, 관심사, 라이프스타일을 촘촘히 알 수 있습니다. SPA 브랜드 중 유니클로와 자라, H&M의 고객 특성은 어떻게 다른지 알아봤습니다. 각 브랜드 고객의 다른 카테고리 간 교차 방문 데이터를 분석한 것입니다.먼저 각 브랜드 방문 고객은 다른 카테고리의 어느 브랜드를 자주 이용할지 타 브랜드 교차 방문 데이터를 살펴봤습니다. 크게 뷰티, 식음료, 문화, 패션 카테고리로 색깔을 구분했습니다. H&M은 패션 브랜드 중심인 반면 유니클로와 자라는 뷰티, 문화, 식음료 브랜드에 고루 관심을 보였습니다.다음으로 각 브랜드 고객은 어떤 이유로 위와 같은 소비 행태를 보이는지 궁금해집니다. 고객이 무엇을 하는지 알더라도 그 사람이 대체 누구인지와 왜 그렇게 행동하는지는 알 수 없으니까요. 이렇게 소비행태를 단순히 현상적으로 관찰하는 데 그친다면 Shared Customer의 필요성이 쉽게 와닿지 않을 겁니다.이에 오픈서베이는 위 데이터에 패널 프로필과 리타겟팅 조사 결과를 결합합니다. 사전 동의한 오베이 앱 패널 대상으로 신용카드 결제 정보와 매장 방문 데이터가 있기 때문에 가능한 분석 방법입니다. 이를 통해 패널의 성별, 연령, 거주지역, 직업 등 기본적인 정보를 알 수 있고 가구 구성, 소득 등 추가 정보를 필요할 때마다 수집할 수 있습니다.이후 궁금한 고객 대상으로 리타겟팅 조사를 합니다. 특정 패널의 프로필이나 과거 어떤 설문에 응답했는지 알 수 있으니 최근 3개월간 유니클로, 자라, H&M 매장 방문자를 대상으로 한 번 더 설문조사를 진행하는 겁니다. 그 결과는 아래 표를 통해 확인하겠습니다.유니클로, 자라, H&M 방문자 대상 리타겟팅 조사(자료 중 일부)H&M에 자주 가는 고객은 가격 민감도 관련 응답과 여러 브랜드를 돌아다니면서 맞는 스타일을 찾는다는 응답이 전반적으로 많았습니다. 즉, 가격에 민감해 발품을 팔아서 스타일에 맞는 옷을 찾는 것이죠. 반면 유니클로는 패션 관여도와 트렌드 민감도는 낮은데 패션 이외의 관여도가 높으며 품질이나 편안함을 중시합니다. 자라는 패션 민감도와 트렌드 민감도가 높아 다른 브랜드보다 약간 더 프리미엄 한 고객군으로 확인됩니다.이어서 의류 구매 시 고려하는 요소와 각 브랜드별 지불 의향 가격대를 알아봤습니다. 유니클로는 소재와 품질, 자라는 스타일과 디자인, H&M은 스타일과 디자인뿐만 아니라 가격 대비 가치를 가장 많이 꼽았습니다. 이처럼 얼핏 비슷해 보이는 세 SPA 브랜드 방문 고객의 행태 데이터를 살펴본 뒤 가설을 세우고 리타겟팅 설문 조사를 진행하면 세 브랜드 고객의 360º 라이프스타일을 분석할 수 있습니다.  위 방법은 또한 상관관계가 높은 타 카테고리 브랜드와의 Co-Promotion 전략을 수립할 때 활용할 수 있습니다. 우리 브랜드 고객의 취향, 관심사, 그리고 라이프스타일을 알게 되면 Co-promotion 및 Collaboration 기회를 만들 수 있기 때문입니다. 예를 들어 “우리 브랜드가 교보문고일 때 제휴하기 적합한 커피전문점 브랜드가 무엇일까?”라는 고민을 할 때 의사결정의 근거로 활용할 수 있는 겁니다.위 SPA 브랜드 때와 마찬가지로 스타벅스, 할리스커피, 폴바셋의 방문 고객은 다른 카테고리의 어느 브랜드를 자주 이용하는지 분석했습니다. 같은 커피전문점이더라도 스타벅스 고객은 타 카테고리에서 주로 GS25와 올리브영, ABC마트를 자주 가는 반면, 할리스커피와 폴바셋은 반디앤루니스와 교보문고를 자주 이용한다는 걸 알 수 있습니다.커피전문점 방문빈도와 상관관계가 높은 카테고리 및 브랜드(자료 중 일부)그렇다면 교보문고가 기존 고객의 구매 유도를 위한 프로모션을 할 때는 교차 방문자가 많은 할리스커피나 폴바셋이 적합하며, 신규 고객 유입을 원할 때는 교차 방문자가 적은 스타벅스가 더욱 적합하다는 걸 판단할 수 있게 됩니다. 물론, 교차 방문 분석뿐만 아니라 후보 파트너 브랜드의 고객 특성과 브랜드 이미지 역시 충분히 고려해야 합니다. | ③ 온·오프라인 채널 간 분석마지막은 온·오프라인 채널 간 Shared Customer 분석입니다. 이는 특히 이마트 등 오프라인 유통 브랜드가 온라인 채널 확장 시 벤치마킹하거나 경쟁 대상으로 삼아야 할 쇼핑몰을 분석할 때 활용할 수 있습니다.오프라인 기반 대형마트 브랜드 중 이마트, 홈플러스의 고객은 온라인 쇼핑 카테고리의 어느 브랜드를 자주 이용하는지 분석했습니다. 이마트 고객은 쿠팡, 홈플러스는 지마켓을 가장 많이 이용했습니다. 몇 년 전 마케팅 시장에서 이슈가 된 ‘이마트와 쿠팡의 기저귀 최저가 전쟁’의 배경을 어느 정도는 이해할 수 있겠습니다.대형마트 구매빈도와 상관관계가 높은 무점포유통 브랜드 상위 5개(자료 중 일부)그럼 다른 듯 비슷해 보이는 이마트와 홈플러스 고객의 교차 구매 데이터는 왜 다소 다르게 나타난 걸까요? 이마트와 홈플러스의 주 이용 고객, 쿠팡과 지마켓의 주 이용 고객에게 리타겟팅 설문 조사를 진행하니 상관관계가 높은 브랜드 간 공통점을 발견할 수 있었습니다.먼저 홈플러스를 주로 이용하는 고객은 쇼핑의 가장 기본적인 속성인 익숙함과 가격 혜택을 이마트 주 이용 고객보다 더 중요하게 여겼습니다. 놀랍게도 지마켓의 주 이용 고객 역시 쿠팡보다 익숙함과 가격 혜택을 중요하게 생각했습니다. 반대로 이마트와 쿠팡 고객은 상품 구성이나 배송과 같은 추가적인 속성을 중시합니다.즉, 서로 다른 온·오프라인 브랜드라도 고객이 중요하게 여기는 가치가 같을 경우 교차 고객을 가질 수 있다는 겁니다. 위 분석 방법 및 사례와 관련된 자세한 내용은 발표 자료 전문을 통해 확인할 수 있습니다. | Q & A질의응답 세션의 주요 내용을 정리해드립니다.Q. 브랜드 간 상관관계를 잘 파악해서 성공·실패한 마케팅 선례도 있나요?A. 아쉽게도 이런 조사 방법이 가능하게 된지 얼마 되지 않아 공개할 수 있는 성공 사례를 소개해 드리기 힘듭니다. 다만 타 브랜드와 Co-Promotion을 준비하면서 오픈서베이를 이용한 고객의 흥미로운 피드백이 있었는데요. 조사 전부터 어떤 브랜드랑 프로모션 하면 좋겠다는 생각은 했다고 합니다. 이유는 간단하게도 “왠지 그럴 것 같으니까”요. 그런데 내부 설득이 힘들었다고 합니다. 제휴 프로젝트는 설득할 결제 라인도 복잡하고 비용도 많이 드니까요. 그런데 오픈서베이와의 설문조사를 통해 명확한 데이터를 얻었고 이는 곧 내부 설득을 위한 근거 자료로 활용됐습니다. 또 생각도 못 했던 부분에서 추가적으로 발견한 인사이트가 매우 가치 있었다고 하네요. Q. 결제 내역 데이터로 구매한 상세 제품 분석까지 가능한가요?A. 카드사와 비슷한 협업해 본 분들이 종종 물어보는 질문입니다. 결국 결제 내역으로 알 수 있는 데이터는 결제 금액이지 상세 품목은 아니니까요. 오픈서베이는 결제 데이터로 영수증을 수집하는 방식으로 진행합니다. 현재 정기 수집하는 데이터는 편의점 결제 내역인데, 패널이 편의점에서 물건을 구매하고 영수증 사진을 찍어 업로드하면 그 내역을 디지털화해 데이터베이스를 만드는 시스템입니다.현재 편의점 외에는 영수증 내역을 정기적으로 수집하고 있지는 않지만 프로젝트 단위로 편의점 외 특정 매장의 구매 내역을 확인하고 싶다면 의뢰를 통해 진행 가능하며, 편의점 데이터는 이미 자체적으로 기획해 데이터를 쌓고 있기 때문에 궁금한 경우 문의 주시면 얼마나 제공 가능한지 답변드릴 수 있습니다. Q. 올리브영처럼 브랜드 단위의 대중적인 트렌드가 있으면 타 카테고리의 모든 브랜드가 올리브영과 상관관계가 높다고 나올 것 같아요. 그럼 교차 방문 및 구매 데이터 분석이 의미 없는 것 아닐까요?A. 오히려 반대입니다. 특정 브랜드가 완전 메가 트렌드인 경우는 타 브랜드와의 상관관계 계수가 높게 나타나지 않습니다. 어떤 브랜드를 조사해도 메가 트렌드 브랜드를 다 이용한다고 나올 테니까요. 가장 정확한 사례는 편의점입니다. 어떤 브랜드든 편의점과의 교차 구매 비중은 높게 나옵니다. 이 경우 상관관계 그래프는 상관없다고 나올 거에요. 그런데 올리브영의 경우는 특정 브랜드를 구매할수록 더 구매하거나 덜 구매한다는 경향이 분명 존재하는 브랜드입니다. 넓은 메가 트렌드의 일부긴 하지만 여전히 특성 있는 사람들이 활용한다는 뜻이죠. | Shared Customer Seminar지난 7월 4일, 디캠프에서 열린 쉐어드 커스터머 세미나는 다양한 채널에서 셀 수 없는 제품과 브랜드가 쏟아지는 시대에 자사 고객 데이터만으로는 소비자를 온전히 이해할 수 없다는 문제의식을 공유하는 분들을 위해 준비한 자리입니다. 고객의 성향을 이해하고 더 많은 구매를 끌어내기 위해서는 ‘내 고객이 다른 어떤 곳을 방문하는지’, ‘다른 무엇을 사고 있는지’ 파악해야 된다는 해결책을 제시하는 자리기도 합니다. 뿐만 아니라 발표와 질의응답 세션 외 오픈서베이의 전문성 있는 어카운트 매니저와 Q&A 부스도 마련돼 여러 고민을 직접 나눌 기회도 제공했습니다.오픈서베이 Shared Customer 세미나 현장(사진. 오픈서베이)세미나에서는 이외에도 아리따움과 이니스프리의 대체 및 보완 관계에 있는 뷰티 브랜드가 무엇인지, 카테고리 및 브랜드별로 함께 프로모션하기 좋은 커피 브랜드는 무엇인지, 온·오프라인 쇼핑몰별로 공유하는 고객 성향은 어떤지를 브랜드 별 예시와 함께 소개했습니다. 이에 세미나 전체 내용이 궁금하신 분은 아래 이메일로 오픈서베이 데이터 팀에 문의주시길 바랍니다.| 오픈서베이 팀E. data@opensurvey.co.krT. 02-3019-7849#오픈서베이 #데이터분석 #시장분석 #마케터 #마케팅 #서비스소개
조회수 685

아마존 진출 각오: 투자는 필수다!

안녕하세요 대한민국 셀러들의 성공적인 아마존 진출을 도와주는 컨설팅 회사이자 대행사인 컨택틱의 이이삭 대표입니다.  오늘 다룰 주제는 ‘투자’입니다. 여러분들께서는 이미 사업을 하시면서 어떤 시장이든 투자가 필수적이라는 사실을 많이 느끼셨을 것입니다. 문득 사업을 하다 보면, 이런 생각이 들 때가 있죠. “돈만 많으면 나도 성공할 수 있을 것 같은데”. 하지만, 돈이 많다고 해서 반드시 그 사업이 성공하는 것은 아닙니다. 사업에 대한 이해, 투자의 목적 등을 고려하지 않은 채 무리하게 M&A를 시도하다가 위기에 빠진 기업들의 사례를 종종 볼 수 있는 것처럼 말이죠. 물론, 아마존에서 물건을 판매하는 셀러 분들께서 인수합병을 위한 투자를 하시는 것은 아니지만, 그만큼 돈이라는 것이 언제, 어떻게 쓰이는지에 따라 초래하는 결과가 천차만별이라는 사실을 말씀드리고 싶었습니다. 본격적인 내용을 다루기에 앞서, 투자 구루(Guru)인 워렌 버핏의 명언을 소개하고자 합니다. Price is what you pay, Value is what you get. 보통 투자의 성공 여부를 가르는 기준 중 하나가 ROI(Return Of Investment) 즉, 투자자본 수익률입니다. 하지만, 위 수치에서 가치(Value)는 포함되지 않습니다. 제가 위 명언을 소개한 이유는 ‘장기적인’ 관점에서 투자를 하기 위해서는 반드시 본인이 지불하는 돈에 가치를 부여할 수 있어야 하기 때문입니다.   투자를 통해 단기간에 성과가 나올 수 있다면, 실패하는 사업자는 없어야 할 것입니다. 하지만, 본인의 돈을 직접 투자했다면, 매몰비용을 생각할 수밖에 없습니다. 광고를 집행하고 아마존 PRIME을 이용했는데도 불구하고, 단기간에 매출이 급증하지 않으면 조급해질 수밖에 없습니다. BEP(Break Even Point)를 맞추기 위해서 계속 자본을 투입하지만, 결과가 같다면, 점점 더 출구전략을 어떻게 세워야 할지를 고민할 수밖에 없게 되는 것입니다. 이때, 본인만의 ‘가치’를 갖고 있어야 합니다. 왜냐하면, ‘투자’라는 것이 반드시 금전적인 돈만을 의미하는 게 아니기 때문입니다. 바로 심리적인 요인도 고려해야 합니다.   제가 사업을 하면서 만난 많은 셀러 분들이 공통적으로 하는 질문이 바로 “아마존에 언제까지 투입해야 하는 것입니까?”입니다. 아마존 시장이 커지면 커질수록 많은 경쟁자들이 난입하고, 브랜드 파워를 갖춘 대기업도 진출을 시작할수록, 초기에 확실한 성과를 얻는 것이 점점 어려워지기 때문이겠죠. 또한, 아마존은 1년에도 몇 번씩 정책이 바뀌는 굉장히 다이내믹한 곳입니다. 가령, ERP(Early Reviewer Program)라고 해서, 초기 진출자를 위한 리뷰 장려 프로그램이 있습니다. 아마존에서 도입한 지 1년도 안된 정책이죠. 그만큼 소비자들이 리뷰를 중요한 레퍼런스로 삼아서 구매 결정을 한다는 것을 알 수 있습니다. 그뿐만 아니라 Amazon Seller Central에 들어가시면, 활용할 수 있는 기능들이 점점 많아짐을 알 수 있습니다. 즉, 시장이 커질수록 기능도 추가되면서 끊임없이 공부해야 성공할 수 있는 시장으로 바뀌고 있는 것이죠. 그럼, 도대체 언제까지 아마존을 붙잡고 있어야 하는가? 특정한 수치를 제시하기는 힘듭니다. 상품 이미지를 등록할 때, 크기만 맞춰서 올리거나, 렌더링을 통해 올린 이미지는 퀄리티도 다르지만 비용도 다르기 때문입니다. EBC(Enhanced Brand Contents)를 이용하시면, PPC뿐만 아니라, 배너 광고를 함으로써 소비자들의 시선을 사로잡을 수 있는 장치를 활용할 수 있습니다. 단, 상표권 등록이 되었을 때만 가능하기 때문에, 이 역시 시간과 비용을 고려해야 하는 것이죠. 리스팅 최적화나 PPC 광고 또한, 아마존 고유의 알고리즘이 바뀌면 그때마다 최적화된 전략으로 대응을 해야 성공 가능성이 높아집니다. 또한 잦은 정책 변경에 대응하고자 컨택틱 블로그를 활용하시거나, 외국의 뉴스레터 등을 팔로우업 하는 이 모든 과정을 투자라고 말씀드릴 수 있는 것입니다.   그래도, 굳이 투자 비용의 가이드라인을 제시해야 한다면, 3-6개월 동안 1,000만 원에서 2,000만 원 정도의 금액을 고려하셔야 합니다. 마케팅, 물류, 법인의 경우 추가 직원이나 업무 대행 서비스 등의 제반 비용을 감안해서 말씀드리는 것입니다.   정리하자면, 본격적으로 아마존으로 진출하기 앞서 마지막으로 심리, 시간, 인력, 금전 등의 비용을 고려했을 때, 도전할만한 가치가 있다는 본인만의 확신을 가지셔야 함을 말씀드리고 싶었습니다. 누구나 성공하는 시장은 없기 때문입니다. 그러나, 조급하지 않고 장기적인 관점에서 꾸준히, 아마존 성공 진출 프로세스를 따르신다면, 좋은 결과 있으리라 믿습니다.   컨택틱의 모든 교육은 파트너인 글로벌셀러 창업연구소와 접수하고 진행합니다. 교육 신청은 아래 링크나 글로벌셀러 창업연구소의 홈페이지를 통해 접수 가능합니다. 오프라인 아마존 입문 과정오프라인 아마존 기초/심화 과정온라인 아마존 입문 과정 그럼 오늘도 즐거운 글로벌 셀링 되세요!   감사합니다. 컨택틱  서울특별시 서초구 서초대로 356, 606호(서초동, 서초지웰타워)대표 전화: 02-538-3939   이메일: support@kontactic.com   홈페이지: https://www.kontactic.com 네이버 블로그: https://blog.naver.com/kontactic  카카오 브런치: https://brunch.co.kr/@allaboutamazon
조회수 4371

피키캐스트 웹툰여신, 피키툰 담당자 ‘헤더’

안녕하세요, 매력 넘치는 옐로 구성원들을 소개하는 사내기자 Y의 옐플 인터뷰, 그 12번째 이야기! 이번 주인공은 바로 피키캐스트에서 피키툰을 담당하고 있는 헤더입니다. 매년 두 곳씩 여행을 다니며 얻은 영감을 바탕으로 계획하고 있는 독립출판 이야기부터, 열혈덕후가 추천해주는 웹툰을 지금 확인해보세요! Y: 안녕하세요! 옐블 독자들을 위해 간단한 소개 부탁 드려요. 헤더: 안녕하세요, 옐로모바일 가족 여러분! 피키캐스트 웹툰 서비스인 ‘피키툰’ 담당자 조혜림(a.k.a. 헤더)입니다. 반가워요 :) Y: 피키툰에서는 어떤 일을 하시나요? 헤더: 신규 작가 발굴부터 웹툰 리뷰 및 퀄리티 검수, 마케팅, 웹툰 서비스 개선 기획까지… A to Z를 관리하고 있어요. 특히 피키에는 대학을 갓 졸업한 신규 작가들이 굉장히 많은데요, 그런 분들을 발굴하는 과정이 정말 재미있어요:) 피키에서 인기가 많았던 '날라리'의 경우, PD가 대학교 졸업작품전에서 엄청 예쁜 그림체를 발견했다고 보여줬는데 보는 순간 반해버렸어요. 그 후 다양한 수정과정을 통해 피키에서 연재를 시작하게 됐습니다.피키툰 '날라리'Y: 그렇다면 그 중에서 가장 좋아하는 작품이 있나요? 헤더: ‘부기영화’라는 웹툰이요! 위트 있는 영화리뷰 웹툰인데, 아마 저처럼 영화를 좋아하는 사람들에겐 취향저격일거예요ㅋㅋ 그 외에도 학원 로맨스물 ‘러브 앤 위시’는 첫 회에 200만뷰를 찍을 정도로 인기가 많았던 작품이고요!  Y: 웽이 나오는 웹툰도 있던데요?헤더: 네! 웽은 옐로모바일 패밀리사인 디메이저 캐릭터인데요, ‘바보요정 웽’이라는 웹툰도 현재 연재되고 있어요. 요즘엔 핔플사이에서 웽은 피키캐스트 최고의 악역이라고 부르고 있어요. Y: 악역이라니! 왜죠?헤더: 실상 생활에서 흔히 볼 수 있는, 넘나 현실적인 악동이라 그런 것 같아요ㅋㅋㅋ Y: 피키와는 어떻게 인연이 닿게 되었나요?헤더: 좀 미친 소리 같지만…. 전에 다니던 회사가 너무 일이 편하고 업무도 많지 않아 약간 지루함을 느끼고 있었어요. 그러다가 아는 분을 만나러 피키캐스트를 방문하게 되었는데, 그 분위기에 반했어요. 마침 당시에 피키캐스트 채용 중이길래 지원하게 됐습니다.Y: 왜 이렇게 낯이 익나 했더니 피키 콘텐츠에 출연하셨더라고요! 헤더: 네! 최근에 부기영화에 그림으로 등장했습니다ㅋㅋ 이토준지에 나오는 ‘토미에’로 등장했는데… 아시는 분들은 아시겠지만, 딱히 정상적인 캐릭터는 아니잖아요? 작가님들이 저를 피키 아이돌로 만들어 주겠다더니 토미에로 만들어버렸어요ㅠㅠ피키툰 '부기영화'에 등장한 헤더Y: ㅋㅋㅋㅋ토미에ㅋㅋㅋㅋ 그리고 뱀파이어 메이크업 콘텐츠도 제보 받았는데요. 헤더: 헉, 보셨나요? 부끄럽네요ㅋㅋㅋ 정해진 메이크업 미션을 타이트한 시간 안에 해야 하는 뷰티마블 라이브쇼였어요. 20초안에 아이라이너 그리기, 거울안보고 10초안에 쉐딩하기….만약 한쪽 눈에 20초를 다 쓰면 그대로 한쪽 눈만 라이너를 하고 있는 거죠. 굴욕적인데 너무 웃겼어요.Y: 처음부터 피키툰으로 지원하신 건가요? 헤더: 아뇨, 사실 처음에는 마케팅으로 입사했는데 갑자기 만화를 담당하게 됐어요. 만화 쪽 경험이 없었지만 덕후라는 이유로 이렇게 좋은 기회를 주셔서 덕분에 너무 즐거운 마음으로 회사를 다니고 있습니다:)  Y: 특별한 취미가 있으신가요? 헤더: 우선 여행 다니는 걸 정말 좋아합니다. 일년에 적어도 두 번은 여행을 가는 걸 목표로 하고 있어요. 올해에는 치앙마이와 뉴욕을 다녀왔죠. 여행을 다니면서 현지 문화에 녹아 들고, 다양한 사람들과 어울리다 보면 일상에서 받았던 스트레스도 해소되고 힐링이 되는 기분이에요. 또 여행 다니면서 현지의 독특한 분위기를 사진으로 찍어 남기는 것도 좋아하고요.뉴욕(좌) 치앙마이(우)Y: 여행다니면서 겪었던 재미있는 에피소드가 있나요? 헤더: 예전에 핀란드를 갔을 때, Flow Festival에 참가한적이 있습니다. 핀란드 최대 규모 뮤직페스티벌인데, 아시안들이 정말 없더라고요. 그래서 그런지 방송사에서 인터뷰를 요청한적이 있어요. 인터뷰가 실제로 방송에 나갔는지는 모르지만요ㅋㅋㅋ헤더: 또 인테리어 꾸미는 데에도 시간과 노력을 많이 들이는 편이예요! 예전에 ‘오늘의 집’이라는 인테리어 앱에도 저희 집 인테리어가 소개된 적도 있고요.  Y: 인테리어 꾸미기라니! 그냥 유지하는 것도 어마무시하게 힘든데..!Y: 피키툰 담당자에게 웹툰 추천을 안 들을 수가 없겠죠? 헤더: 최근 본 작품 중에서는 레진의 ‘뼈와 살’이라는 웹툰을 추천합니다. 약간 19금 요소가 들어있지만(부끄) 마치 김기덕감독의 영화를 한편 본 느낌이에요:) 또 올레웹툰의 ‘말하기엔 사소한’이라는 작품도 무척 좋아합니다. 고립과 결핍, 외로움을 치유해가는 20대 후반 여성의 이야기에 마음이 아련해져요. 만화책으로는 우라사와 나오키와 아다치 미츠루, 야자와 아이의 작품을 좋아하고요. 최근엔 고다 요시이에와 요시다 아카미 작가에 빠져있어요!Y: 피키캐스트 입사 이후 가장 기억나는 에피소드가 있나요? 헤더: 예전에 고등학교 견학 프로그램을 기획한 적이 있어요. 그때 담당 선생님께서 아이들에게 좋은 경험을 하게 해줘서 정말 고맙다고 몇 번을 말씀하시더라고요. 견학이 끝나고 일주일 후에 손편지와 함께 엄청난 양의 닭갈비를 보내주셔서 피키 멤버들과 함께 나눠먹었어요. 사실 회사를 다니면서 경험하기 힘든 일이잖아요. 너무 감동스러워서 아직까지 기억에 남아요.  Y: 피키캐스트와 함께 하면서 좋은 점은 무엇인가요? 헤더: 제가 좋아하는 웹툰 분야의 일을 맡겨주셔서 너무 재미있게 사심을 채우며 일을 하고 있습니다. 업무가 만화 쪽이다 보니 매일 만화를 봐도 아무도 신경 쓰지 않아요ㅋㅋㅋ 덕업일치를 실현하고 있어서 행복해요.  Y: 앞으로는 어떤 일을 해보고 싶으신가요? 헤더: 제 오랜 꿈이 개인 서점을 운영하는 거예요. 어렸을 때부터 보수동 헌책방골목을 자주 갔었고 여행을 가면 현지 서점이나 헌책방을 꼭 찾아갈 정도로 개인서점 특유의 분위기를 너무 좋아해요. 언젠가는 꼭 제 손길이 가득 담긴 책방을 오픈하고 싶어요.Y: 올해가 얼마 남지 않았는데요, 그 전에 이루고 싶은 게 있나요? 헤더: 올해는 아니지만 이번 겨울 안에 이루고자 하는 목표는 있습니다. 제 친구 중에 사진작가를 하는 친구가 있어요. 저는 글을 쓰는 걸 좋아하고요. 둘이서 같이 포토에세이를 독립출판을 해보려고 해요.  Y: 마지막으로 못다한 한마디 부탁 드립니다! 헤더: 앞으로 피키툰 업무가 많아질 계획이라, 인원을 조금 늘리고자 하고 있어요. 만화를 좋아하는 분들! 이 업무가 내 업무다! 하시는 분들 이력서 마구마구 넣어주세요:D 앞으로 피키캐스트와 피키툰 많이 사랑해주세요! 감사합니다:)<현재 연재중인 피키툰 리스트>1.     먼지소녀 - 티끌모아 태산이라더니...2.     송사리 레볼루션 - 현실적인 듯 현실적이지 않은 쌍둥이 남매의 <혁명> 적응기3.     네임펜으로 그린 그림 - 홍승우 작가의 감성 터치 피키툰4.     2차원 개그 - 2차원개그는 두 컷으로 말한다! 상식파괴 피키툰5.     바보요정 웽 - 내가 바보인건 나 때문이 아니었어!6.     안녕 도깨비 - 평화로운 도깨비 마을에 나타난 인간 소녀7.     무국 - 학교에서 칼 들고 설치는 무서운 10대들의 세계8.     러브 앤 위시 - 섬세한 감성터치! 피키툰 최초의 순정만화9.     사랑이 커다래 - 교회오빠보다 더 설레는 오빠를 쫓는 9살 귀요미10.   여고를 아느냐 - 환상 따위는 거부한다! 거짓 따위 없는 리얼 여고 라이프11.   남팬인데요? - 남자 아이돌에겐 오직 여자 팬만 있단 생각은 금물!12.   부기영화 - 영화 본 뒤엔 만화로 해석 보자! 피키툰 최초의 영화 해석툰. 13.   토끼는 숨죽여 울고 있었다 - 당신의 소름을 책임집니다.14.   고구마 소녀 - 7년째 썸만 타는 역대급 답답이 고구마 소녀15.   날라리 - 미치도록 피하고 싶은 날라리와 왕따의 트루 로맨스16.   소음 - 같은 반에 내 스토커가 있었다17.   언무드셀라 - 게임 같은 삶을 꿈꾸던 당신에게 색다른 모험의 기회가 펼쳐진다면?18.   용사입니다 미용사 - 개성만점 미용과 학생들의 머리털 빠지게 웃긴 학교생활19.   연애에 서툰 뱀파이어 - 모태솔로 경력 170년! 격이 다른 연애고자의 등장20.   드리밍 - 8년의 내 인생이 꿈이었다면? 사랑을 되찾기 위해 꿈속으로 들어간 여자 21.   뚱뚱해도 괜찮아 - 이란성 쌍둥이 자매의 반전 연애 드라마22.   알아집니다 - 낭만의 섬, 제주도에서 펼쳐지는 도시 여자 생존기 23.   세계 최고의 꽃미남이 되다 - 아름다움의 기준이 뒤바뀐 세상! 24.   여름소년 - 1988년 여름 우리네 귓가에 초록의 총성이 울려 퍼집니다. 25.   에스 - 1988년에 일어난 최악의 연쇄살인사건! 피키툰 신작 범죄스릴러26.   메르헨 위치스 - 남자로 환생한 마녀는 과연 무사히 기사님을 찾을 수 있을까?27.   영원의 빛 - 집착해줘. 피키툰 최초의 욕망멜로28.   러브루저 - 언제까지 썸만 탈꺼야? 이제 연애할 때도 됐잖아!29.   부산늑대 - 부산 캠퍼스에서 시작된 늑대인간과의 로맨스30.   야귀록 - 강동원 뺨치는 퇴마사의 등장! 애절한 환타지 로맨스31.   시선 - 어디선가 나를 지켜보는 낯선 시선. 피키툰 공포 단편선
조회수 1683

안드로이드 스튜디오

안녕하세요. 크몽 개발팀 입니다.오늘의 포스팅 주제는 "안드로이드 스튜디오" 입니다.안드로이드 스튜디오는 구글이 직접 만든 안드로이드 앱 개발 도구를 말하는데요.안드로이드 스튜디오는 2013년 5월 개발자 컨퍼런스를 통해 프리뷰 버젼을 처음 공개하였습니다.1년 6개월 정도의 기간동안 베타버전이였지만  지난달 8일에  안정화된 정식버전 1.0이 공개되었습니다.안드로이드 개발자 사이트에 가시면 공식적으로 다운받아서 안드로이드 앱을 개발 할 수 있습니다.( Eclipse로 앱을 개발중인데 개발자 사이트에 배포중인 ADT가 내려가서 당황했던 기억이 나네요^^ ) 안드로이드 스튜디오는 IntelliJ 기반으로 만들어 졌는데요.IntelliJ는 워낙 유명한 개발도구인지라 많은 개발자분들이 알고 계실겁니다.Eclipse 와 같이 통합개발툴인데 안정성과 속도면에서 Eclipse보다 뛰어나기때문입니다.하지만 Eclipse가 안드로이드 초기부터 개발자들이 이용해 왔기 때문에 대부분의 개발들에게 익숙하고현재 나온 가이드 or Tip 들이 Eclipse에 기준이 되어있어서 여러부분에서 시행착오를 겪을거 같습니다.그래서 그런지 안드로이드 스튜디오 정식버젼이 나왔지만 아직은 익숙한 Eclipse에 손이가는데요.앞으로 구글에서 공식적으로 ADT에 대한 지원을 끊었으니 조만간 안드로이드 스튜디오로 갈아탈려고 합니다.Android 개발자 사이트 링크 : http://developer.android.com/index.html----------------------------------------------------------------------------------------새롭게 나온 안드로이드 개발도구 "안드로이드 스튜디오"에 대하여  소개하는  포스팅 해보았습니다.다음에는 안드로이드 스튜디오를 직접 사용해보고 각각의 특징들에 대해좀 더 자세히 설명해드리겠습니다. ^_^#크몽 #개발팀 #인턴 #인턴생활 #팀원소개 #업무환경
조회수 691

코호트 분석(Cohort Analysis)

올해 1월, Google Analytics(이하 GA)에서 Audience 카테고리에 Cohort Analysis(코호트 분석)라는 리포트가 추가되었습니다. 그런데 UI가 늘 보던 리포트와 달리 독특해서 이 리포트는 어떻게 데이터를 보고 해석해야 할지 막막하기까지 합니다. 일단 리포트보다 용어조차 생소한 코호트에 대한 이해가 필요합니다.( GA > Audience > Cohort Analysis Report )코호트 분석이란코호트 : 특정 기간에 특정의 경험을 공유한 사람들의 집합http://en.Wikipedia.org/wiki/Cohort_(statistics)코호트 분석 : 특정 기간에 특정의 경험을 공유한 집단간의 행동패턴을 비교/분석http://en.Wikipedia.org/wiki/Cohort_analysis리포트 조회 방법모바일 앱 분석에서 가장 많이 사용하는 코호트 분석은 같은 기간에 앱 설치를 경험한 사용자 그룹이 시간이 지남에 따라 앱의 꾸준한 사용여부(Retention)를 분석하는 것입니다. 앱은 설치보다 지속적인 재사용성이 앱 비즈니스를 좌우하기 때문입니다.( WISETRACKER > 방문행동 > Retention 리포트 )A열은 특정 기간에 앱을 설치한 사용자의 집단이며, +기간이 표기된 B열은 설치 시점으로부터 재사용율/삭제율을 제공하고 있는데, 여기서 데이터를 해석하기 위해선 데이터를 수직적으로 바라봐야 합니다.위 데이터로 예를 들면 다음과 같습니다.A : 2016년 12월 1일부터 5일까지 설치수가 꾸준히 증가하고 있다.B : 설치 후 하루가 지난 뒤 재사용률은 지속적으로 떨어지고 있고 오히려 삭제율이 증가하고 있다.코호트 분석 왜 필요한가첫째, 비즈니스 상황을 알 수 있다.위 그림의 데이터를 단순 앱 설치 추세 리포트로 보았다고 생각해봅시다. 설치수가 꾸준히 증가하고 있기 때문에 “우리 앱의 시장반응이 좋구나”라는 1차원적인 결과만 얻었을 것입니다. 그러나 코호트 분석을 통해 신규 고객 획득은 잘 이루어지고 있으나, 고객이 된 이후의 사용성이 떨어지고 앱을 삭제하는 비율이 점점 증가하고 있다는 사실을 인지함으로, 마케팅은 밑 빠진 독에 물 붓는 격이니 보다 고객관리/최적화에 먼저 집중해야 함을 알 수 있습니다. 이처럼 현재의 상황을 정확히 이해해야 더 나은 의사결정을 할 수 있습니다.둘째, 깊은 마케팅 인사이트 얻을 수 있다.보통 모바일 마케팅의 성과 지표로 얻을 수 있는 건 클릭수, 설치수 정도 입니다. 그러나 이것만으로 가치 채널을 도출하고 마케팅 전략을 수립하기엔 데이터가 부족한 것이 사실입니다. 같은 채널이라 하더라도 시점에 따라 게재하는 광고 내용도 다를 수 있고, 설치수가 많더라도 체리피커들 때문에 설치 후 바로 삭제하는(광고비만 날리는..) 비율도 꽤 높기 때문에 설치 이후의 데이터가 꼭 필요합니다. 코호트 분석은 특히 모바일 앱 기반의 스타트업에게 매우 중요한 분석기법으로, 사업 단계마다 우리가 잘하고 있는지 여부를 판단하고 더 나은 의사결정을 돕는 중요한 나침반 역할을 할 것입니다. * WISETRACKER는 모바일 광고 성과 측정부터 In-app 이용자/컨텐츠 분석, 푸시메시지 최적화까지 지원하는 모바일 통합 분석/타겟팅 솔루션입니다. 와이즈트래커 솔루션의 무료체험을 원하실 경우 여기를 클릭해주세요.* WISETRACKER가 제공하는 무료 데이터 분석 컨설팅를 원하신다면 여기를 클릭해주세요.#와이즈트래커 #데이터분석 #서비스소개 #코호트분석

기업문화 엿볼 때, 더팀스

로그인

/