이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.
자바에서 http/s에 연결할땐 HttpURLConnection, HttpsURLConnection 와 같은 클래스를 쓰게됩니다. 상속관계의 클래스이기 때문에 HttpURLConnection 만 가지고 설명하겠습니다.
1. 세션은 어디에 저장되는가?
세션은 다들 아시다시피 서버에 저장되며, 세션아이디를 통해 인증합니다. 세션아이디는 사물함의 열쇠라고 보시면됩니다. 즉, 처음에 사물함을 배정 받고 사물함의 132번 열쇠를 받았다고합니다. 이후 132번 열쇠를 통해 자신의 사물함에 접근하는 것과 같습니다. http의 공격기법 중 스크립트 인젝션은 대부분 클라이언트 브라우저에서 이 열쇠를 복사하는 행위라고 보시면됩니다. (이 세션아이디는 수십자의 임의 문자열이기 때문에 찍어맞추는건 거의 불가능합니다. : 어떤 소프트웨어의 정품 시디키를 찍어서 맞출 확률이라고 보시면됩니다.) 가리사니는 사로 통합 세션서버에서 세션을 가져오게 되며, 세션아이디의 이름 또한 조금 다릅니다. 그럼 WAS마다 또 대부분의 대형서비스처럼 고유의 세션아이디 이름을 가지고 있는 경우 이를 클라이언트에 어떻게 저장하느냐는 문제가 생길 수 있습니다. 이걸 통합하는것이 서버-사이드-쿠키 입니다. 서버의 응답해더에서 Set-Cookie 를 보내게 되며, 클라이언트를 이를 저장해 뒀다가 서버에 요청을 보낼때 Cookie 에 실어서 보내게 됩니다. 예를들어 브라우저에서 서버사이트쿠키를 막는다고하면, 해당 브라우저로 세션을 통한 로그인이 되지 않을 것 입니다.
2. 쿠키를 가져와 보자!
사실 서버에서 언제 세션아이디를 주느냐는 서버를 프로그래밍한사람 마음이기 때문에, 모든 연결에 있어서 응답해더의 Set-Cookie 를 감시하고있어야 합니다.
HttpURLConnection web = ...;
// 모든 연결시마다 항상 새롭게 세팅된 쿠키가 있는지 가져옵니다.
// 주의 Set-Cookie 는 항상 주는것이 아니니 서버에서 보내줄대만 보관해야합니다.
String cookieTemp = web.getHeaderField("Set-Cookie");
if (cookieTemp != null)
{
cookie = cookieTemp;
}
3. 쿠키를 실어 보내자!
HttpURLConnection web = ...;
// 아까 가져왔던 쿠키를 새로운 연결시에 실어보냅니다.
String cookie = web.setRequestProperty("Cookie", cookie);
여기까지 했다면, 세션이 적용된 결과를 받을 수 있게 됩니다.!!
추신
필자는 예전에 스크립트 인젝션으로 세션아이디가 복사되는것을 보고 세션아이디 + 아이피로 제한하여 접속을 막아야하는 것이 정상이 아닌가 생각한적이 있었습니다. 하지만 모바일 인터넷이 대중화된 이후 아… 이래서 아이피를 같이 확인 하지 않는 구나 라고 생각했습니다.