올빼미공방
Nginx로 Unique User 탐지하기 본문
Nginx로 Unique User 탐지하기
1. 개요
Nginx access log를 사용자 분석에 활용하기 위해서는, Nginx에서 제공하는 Default access log만으로는 부족합니다.
유저를 특정할 수 있는 정보가 부족하기 때문입니다. 이에 Log파일에 Userid 등 사용자 분석 기능에 활용할 수 있는 정보를 삽입하는 것이 필요합니다.
Nginx의 userid 모듈과 cookie를 활용하여, Unique User을 탐지하고 이 정보를 access log상에 남겨 봅시다.
2. userid module 활용하기
userid module은 client 탐지를 위하여, client의 브라우저에 쿠키를 삽입합니다.
nginx configuration file을 수정하는 것만으로도, 간단히 적용할 수 있습니다.
아래는 userid module 공식 문서에 나와있는 예제입니다.
- userid on;
- userid_name uid;
- userid_domain example.com;
- userid_path /;
- userid_expires 365d;
- userid_p3p 'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';
userid directive는 Cookie의 설정 여부와 logging 여부를 나타냅니다.
userid_name은 cookie의 이름을 설정합니다.
userid_domain은 cookie가 설정되는 domain을 의미하는데, domain이 있는 웹 사이트의 경우 domain name을, 그렇지 않은 경우에는 ip주소를 기입해주시면 됩니다.
userid_path또한 cookie가 설정되는 path를 의미하며 default는 '/'입니다.
userid_expires는 브라우저가 쿠키를 유지하는 기간을 의미합니다.
userid_p3p는 쿠키와 함께 보내질 P3P 헤더의 값을 의미합니다.
유저가 우리의 웹 서비스에 처음 접근하는 경우 쿠키가 삽입되며, 삽입된 쿠키 정보는 $uid_got 이라는 변수를 통해 확인할 수 있습니다.
uid=EDF316A5B6AD3F5D892C082502030303
위와 같은 형식으로 저장이 됩니다. 이를 통해 유저를 특정할 수 있습니다.
3. Cookie 활용하기
이제 유저를 특정할 수 있게 되었습니다. 그렇지만 이것만으로는 조금 부족한 느낌이 듭니다.
유저가 처음 사이트를 방문한 시점을 알 수 있다면, 시간에 따라 유저를 분류할 수 있고 이는 유저 분석에 도움이 됩니다.
따라서, 유저의 브라우저에 유저가 처음 사이트를 방문한 시점을 저장하도록 합시다.
- location ~ / {
- set $visited $cookie_firstvisit;
- if ($visited = "") {
- add_header Set-Cookie "firstvisit=$time_local";
- }
- }
위의 예시 코드는 유저가 사이트에 처음 방문하는 경우, 유저의 브라우저에 처음 방문한 시간을 "firstvisit"이라는 cookie에 저장하는 기능을 합니다.
코드를 분석하기에 앞서, 쿠키를 생성하고 값을 참조하는 법에 대하여 알아보겠습니다.
쿠키 생성: add_header Set-Cookie "name=value";
name에는 쿠키의 이름, value에는 그 쿠키에 저장할 값을 넣어줍니다.
쿠키 참조: $cookie_name
name에는 참조할 쿠키의 이름을 기입해줍니다.
다시 위의 코드로 돌아가 봅시다.
set $visited $cookie_firstvisit;
위의 코드는, "firstvisit"이라는 쿠키의 값을 visited라는 변수의 값으로 설정합니다. 따라서 쿠키가 존재하지 않는 경우, if문이 실행되어 쿠키가 생성되고 그 값은 최초 방문한 시간과 같게 되는 것입니다.
이처럼 userid와 cookie를 활용하면, 사용자 분석에 필요한 정보들을 획득할 수 있을 뿐만 아니라, 브라우저를 통해 사이트에 접근하지 않는 access의 경우에는 userid가 생성되지 않기 때문에, 실제로 브라우저를 통해 사이트에 접근하는 "실제 유저"만을 대상으로 사용자 분석을 진행할 수 있습니다.