본문 바로가기

알고리즘

제한 시간이 있는 url 생성하기

반응형

일반적인 url의 경우에는 언제나 접속을 하면 그 데이터가 사라지지 않는 한 계속 열람이 가능하다. 그리고 어떤 데이터에 대해서는 일정 시간이 지나면 접근이 안되게 하고 싶은 내용이 있을 것이다. 예를 들면 만화 서비스가 있겠다. 만화 서비스의 경우에 일정 시간 동안에는 잠시 무료로 볼 수 있게 하였다가 그 시간이 지난 이후에는 무료에서 유료로 전환하는 서비스를 구축한다면 이럴 수 있겠다.

예를 들면 레진코믹스에서 만화 이미지를 제공하는 방법이 있다. 만화 이미지의 url을 보면 뒤에 access_token을 이용해서 이 토큰을 기준으로 해서 만화를 구입한 사람인지 여부를 확인하여 유효하지 않은 토큰인 경우에는 에러메시지를 보여주는 방법이다.


레바툰 프롤로그의 1번째 컷


일정 시간이 지나면 접속이 안되게 하는 url을 만드는 방법은 크게 2가지 방법으로 생각할 수 있는데, 첫 번째 방법은 데이터베이스와 연동을 시켜서 사용이고, 두 번째 방법은 url부분에 timestamp값을 포함해서 사용하는 방법이 있을 수 있겠다.


첫 번째 방법으로 쉽게 구현하는 방법은 데이터베이스를 이용해서 파일 다운로드를 구현하는 방법과 거의 유사하게 구축이 가능하다. 즉, 유효기간이 있는 url, 실제로 서비스를 할 내용이 있는 url(혹은 서비스를 할 내용), 제한시간을 Column으로 하는 Table을 생성하면 된다. 이 방법의 장점은 따로 추가적인 url의 데이터의 전송을 하지 않아도 된다는 것과 Column을 추가함으로써 손쉽게 url의 제한 사항을 만들 수 있다는 것이다. 그러나 유효성이 있는 url이 많아지면, 그만큼의 db 용량을 사용하게 되며, 또한 SQL 질의부분에서 오래걸린다는 단점이 있다.


두 번째 방법은 timestamp값을 같이 포함해서 전송을 하기 때문에 추가적인 데이터를 저장할 필요가 없고, SQL질의를 할 필요가 없기 때문에 매우 빠르게 데이터를 보여 줄 수 있다는 장점이 있다. 단점의 경우에는 이 timestamp값이 직접 요청시에 보여지기 때문에 사용자가 이를 조작해서 계속적으로 접근이 가능하게 할 수도 있다. 그렇기 때문에 이러한 단점을 해결하기 위한 방법으로 HMAC 알고리즘을 사용하면 된다.


이 HMAC 알고리즘은 네이버의 게임개발자 사이트에 들어가더라도 소개를 하고 있는 방법일 정도로 많이 사용되는 알고리즘이다. 당장 네이버의 몇 가지 서비스의 경우에도 이 알고리즘을 사용하는 것을 알았다.


이 알고리즘은 비밀키를 절대로 알게해서는 안된다. 왜냐하면 비밀키를 알아낸다면 매우 쉽게 url을 생성할 수 있기 때문에 악용이 가능하기 때문이다.


제한 시간이 있는 url을 생성하는 방법은 매우 간단하다. 일단 timestamp를 url의 GET data로 추가한 뒤에 그 url을 HMAC 알고리즘과 비밀키를 이용해서 해싱을 한 다음에 그 값을 GET data로 추가를 한 url을 사용하면 된다.

즉 형태가 다음과 같은 url이 되겠다.

http://{주소}?{전송할 내용들}&time={현재시간}&check={알고리즘을 이용해 해싱한 값}


그리고 이 url의 유효성을 체크하는 방법은 매우 간단하다. 먼저 time에 있는 값이 제한 시간 이내인지를 체크한다. 다음은 check 데이터를 제외한 url을 HMAC 알고리즘과 비밀키를 이용해서 해싱을 한다. 그리고 그 해싱을 한 값과 check 데이터를 비교해서 같은 경우에는 유효한 url이고, 다른 경우는 유효하지 않은 url이라고 할 수 있다.


HMAC 알고리즘은 Python과 PHP에서 공식적으로 지원을 해주는 해싱알고리즘이기 때문에 추가적으로 사용자가 구현을 할 필요가 없다는 것이 편한 점이다.



반응형