웹, HTML

InternetSetCookie, InternetGetCookie 사용 밥법

디버그정 2016. 3. 9. 00:01

cookie_func.txt


// 참고) IE 쿠키 폴더
// 비스타 이상: C:\Users\사용자\AppData\Roaming\Microsoft\Windows\Cookies
// XP: C:\Documents and Settings\사용자\Cookies 


// ======= 쿠키 처리 =======
// ★ URL은 반드시 풀네임을 입력한다. 앞의 http:// 문자열이 생략된 경우 쿠키가 생성되지 않았다.
// ★ path를 입력할 경우 반드시 /로 시작해야 한다. 그렇지 않으면 아예 생성되지 않았다.
// path의 끝에 /가 있는 경우와 없는 경우는 서로 다르다. /abc와 /abc/는 다른 쿠키들이며 둘 다 생성할 수 있었다.
// ex) InternetSetCookie("http://www.test.com", NULL, "TestName = TestVal; path = /abc/; expires = Sat, 01-Jan-3000 00:00:00 GMT;"); // 3000년까지 유지된다.
// InternetSetCookie("http://www.test.com", NULL, "TestName =; path = /abc/; expires = 00:00:00 GMT;"); // 과거 날짜를 입력하면 만료로 삭제된다.

SYSTEMTIME st;
FILETIME ft;
TCHAR *pszURL = _T("http://www.test.com");
TCHAR *pszCookieName = _T("TestName");
TCHAR *pszCookieValue = _T("TestValue");
TCHAR *pszPath = _T("/abc/");
TCHAR szCookieData[2048];
TCHAR szCookieData2[2048];
DWORD dwSize;
LONGLONG cur;

GetSystemTime(&st);
SystemTimeToFileTime(&st, &ft); // 시간 계산을 위해 파일타임으로 변환
cur = (LONGLONG)ft.dwHighDateTime << 32 | (LONGLONG)ft.dwLowDateTime;
cur += (LONGLONG)10000000 * (LONGLONG)3600 * (LONGLONG)24; // 1일 후로 만료시간 설정. 1초 = 10000000(천만). 계산시 42억이 쉽게 넘어가므로 반드시 형변환한다.
ft.dwHighDateTime = (DWORD)(cur >> 32) ;
ft.dwLowDateTime = (DWORD)(0xFFFFFFFF & cur);
FileTimeToSystemTime(&ft, &st); // 다시 시스템타임으로 변환
wsprintf(szCookieData, _T("%s = %s; path = %s;"), pszCookieName, pszCookieValue, pszPath);

// ★ Sat, Jan 등 영문 표기를 위해 영어(미국) 로케일 0x0409를 선택한다. 참고로 한국어는 0x0412이다.
GetDateFormat(0x0409, 0, &st, _T(" expires = ddd, dd-MMM-yyyy"), szCookieData + lstrlen(szCookieData), 64);
GetTimeFormat(0x0409, 0, &st, _T(" hh:mm:ss GMT;"), szCookieData + lstrlen(szCookieData), 64);
MessageBox(NULL, szCookieData , _T("res"), MB_TOPMOST);
InternetSetCookie(pszURL, NULL, szCookieData);
lstrcpy(szCookieData2, szCookieData);
szCookieData2[0] = _T('A'); // 2개 생성된 형태를 보기 위해 간단히 생성
InternetSetCookie(pszURL, NULL, szCookieData2);

dwSize = sizeof(szCookieData) / sizeof(szCookieData[0]);
// path가 존재하는 경우 첫번째 인수를 ★ URL+path로 설정해야 한다. 해당 경로에 존재하는 쿠키네임과 값이 모두 구해진다.
if (InternetGetCookie("http://www.test.com/abc/", NULL, szCookieData, &dwSize))
MessageBox(NULL, szCookieData , _T("res"), MB_TOPMOST);


===========================================================================

쿠키 폴더에 사용자@www.test[2].txt 형태의 텍스트 파일이 생성된다. 내용은 아래와 같다.

TestName
TestValue
www.test.com/abc/
3584
3928339968
30505392
1426939568
30505292
*
AestName
TestValue
www.test.com/abc/
3584
3928339968
30505392
1426939568
30505292
*