오픈된 QR 코드와 개인용 QR의 설계적 차이점
오늘 다룰 내용은 회사 내부 팀원 교육과정에서 이야기한 내용을 정리한 것이다. 실제 서비스 설계를 진행하면서 QR 코드를 사용할 때가 있다. 오늘은 인쇄되어 누구나 사용할 수 있는 QR코드와, 스마트폰 기준으로 생성되는 개인용 QR 코드의 차이에 대해서 이야기해보려한다.
QR코드는 일반적으로 두가지 사용방식이 있다. 한가지는 인쇄된 형태로 누구나 QR코드 기반으로 '특정 URL'에 접속할 수 있도록 하는 것이다. 이 방식은 일반적으로 'OO페이'같은 특정 결제를 처리할 때나, 포스터 등의 인쇄물에서 QR 코드로 접속을 유도할 때에 사용된다. 누구나 사용할 수 있는 형태이기 때문에 인터넷 URL을 담고있는 경우가 많지만, 사용처에 따라 '특정한 Key 값을 갖고있는 경우'도 있다.
예를 들어 한 카페에서 QR 결제를 진행한다고 해보자. 이 경우 카페에서 사용하는 POS기 (계산전용 기기) 에서 카카오페이 결제를 요청한 상태로 대기를 해줘야한다. 이후 QR URL 코드를 통해 '지금 접속한 사람이 이 카페에서 결제를 하려는 사람'이라는 걸 증명하게된다. 그러니 이런 '결제'의 케이스에서는 QR코드가 '카페의 가맹점 코드'가 찍힌 '결제 Key'값을 갖고있는 셈이다. 이런 오픈된 방식의 QR코드는 특정 홈페이지나 URL에 접속하게할 수 있다는 장점이 있다. 하지만 누구나 접속할 수 있다는 점 때문에 보안성이 떨어지는 문제가 있다. 그렇기에 결제와 같이 '특정 조건'이 준비되어야만 처리될 수 있는 방식으로 응용하는 방식'이 실제 서비스에도 더 적합하다.
QR기반 - 코로나 19 예방접종 / 체크인 증명 서비스의 사례
https://www.korea.kr/news/visualNewsView.do?newsId=148890472
카카오페이 QR 결제의 사례
QR코드를 다수에게 오픈하지않고, 개인용으로 사용하는 방식도 있다. 대부분 출입구에서 소속을 증명하거나, 시험장에 입장하는 등 - '개인의 본인증명'에 사용하는 경우가 많다. 이 경우는 스마트폰으로 QR코드를 읽는 것이 아니라, '화면에 표출하는 방식'을 쓰게된다. 그래서 QR코드를 인식해줄 별도의 QR코드 인식용 기기가 필요해진다. 이 기기는 별도 키오스크 형태로 개발되는 경우가 많은데, 이 기기가 다시 별도 컴퓨터, DB (데이터베이스)와 연결되는 것이 대부분이다.
QR코드를 화면상에 출력하는 방식은, 인쇄하는 방식에 비해 안정성이 높은 편이다. 그래서 온라인 티켓이나, 입장용 자기증명 앱 서비스에서 주로 이 방식을 사용한다. 하지만 여전히 이 방식에는 치명적인 문제가 있다. 앱 화면을 스크린샷 형태로 찍어서 사용할 경우, 실제 소유주가 아니더라도 악용이 가능하기 때문이다. 이런 문제 때문에 대부분의 스마트폰 기반 QR코드들은 '특정 시간동안만 유효한' QR코드를 생성해낸다. 만약 특정 시간이 지나버린다면, 해당 QR 코드를 사용하더라도 사용자 인증을 받을 수 없다.
이런 방식을 사용하려면 '매번 새로운 QR코드'를 생성하는 QR코드 제너레이팅 기법을 사용하거나, QR코드 생성시점을 기준으로 '인증 Key'를 생성하는 기법을 생각해볼 수 있다. QR 코드를 매번 새로 만들어버리는 경우, 유효한 QR코드가 매번 바뀌게된다. 그러니 스크린샷을 찍더라도 새로 생성된 QR코드가 아니면 인증이 불가능해지는 방식이다. 반대로 QR 코드 인증을 '활성화하는 방식'이라면, 동일 QR코드를 인쇄해서 갖고있더라도, 인증시작 시점이 맞지않으면 사용할 수 없는 형태가 된다.
실제 앱서비스들 중에는 스크린샷을 통해 인증이 가능한 경우도 있으니, 스크린샷을 통해 다른 사람이 사용하지 않도록 주의해야한다.
에어서울의 QR기반 온라인 탑승권 사례
http://flyairseoul.com/CW/ko/online-check-in.do
출입통제용 QR코드 사례
QR코드는 응용하기에 따라 결제나, 본인인증 등 다양한 지점에서 사용할 수 있다. 하지만 보안에 대한 고민이 없다면, 스크린샷 기반의 공유 등으로 악용될 가능성을 갖고있다. 그렇기에 자신이 QR을 서비스 내에 사용할 때, 어떤 방식으로 사용해야할지. 확실하게 체크하고 여러 시나리오들을 고민해보아야한다. 심지어 QR 코드를 바탕으로한 모바일 바이러스 살포나, QR 기반의 정보해킹 사례들도 존재하기 때문에, 아무 QR코드나 스캔해보는 건 굉장히 위험한 일이다. 특히 인쇄된 QR 코드는 어떤 곳으로 이동하지 알 수가 없다. 이런 QR을 이용한 여러 악용사례가 존재하기때문에, QR을 스캔하는 방식보다는 별도 QR 코드를 키오스크 등에 인증시키는 방식이 훨씬 안전하다고 할 수 있다.
스크린샷 기반의 QR코드 악용사례
https://www.ilyoseoul.co.kr/news/articleView.html?idxno=459879
QR 코드 기반의 악성 바이러스 / 악성앱 서비스 몰래 설치 케이스
https://m.blog.naver.com/skinfosec2000/222109926589
만약 본인이 QR 코드를 서비스에 꼭 넣어야한다면, 가능한한 '시간제한'을 두어서 인증을 제한해야한다. 또한 QR코드를 매번 재생성시키는 방향을 사용하는 것이 안전하다. 그렇지않은 경우 본인인증이나 금융거래 등에 사용할 때, 여러 악용사례에 노출되기 쉽다. 그러니 QR코드의 한계점이나, 위험성에 대해서 인지하고 서비스에 사용하는 것을 권장한다.