자바 프로그램으로 크롤링 시 로그인이 필요한데

조회수 1553회

프로그램이기 때문에 접속 시 기본 정보도 다르고 접속에 여러 정보도 필요한 것 같습니다.

혹시 자바 프로그램으로 로그인을 위한 구체적인 방법을 알 수 있을까요?

잡코리아나 사람인과 같은 사이트에서 로그인을 하려 하지만

Jsoup 이용 시에는 id와 pw 입력만으로 해결이 되지 않네요.

헤더나 쿠키 정보도 활용하여 요청도 해봤지만 어떤 헤더와 쿠키를 활용해야하는지 구체적으로 모르겠어서 실패하는 것 같습니다.

웹 브라우저를 안 띄우고 접속 가능한 방법이 궁금합니다.

1 답변

  • 크롤러를 만드는 중이시군녀. 제가 경험은 없지만 줏어들은바에 의하면, 많은 사이트에서 크롤러를 방지하기 위한 수단이 적용되어 있다고 합니다. 자바스크립트를 실행할 수 없는 클라이언트인지 판단해서 더 이상 진행이 안되게 한다던가 하는 식인거죠. 이건 그냥 한 번 말씀드려 봤구요.


    위와 같은 방어장치가 없다치고 말을 해보죠.

    우선 웹에서의 로그인은 보통 서버의 세션 정보와 클라이언트의 쿠키로 구현합니다.

    가령 사람인을 쿠키가 없는 상태(시크릿/프라이빗 브라우저 이용)에서 접속해서 트래픽을 분석해보면, 응답 헤더에 이런 값들이 존재합니다:

    • Set-Cookie: PHPSESSID=4sftcbvogf8nticvhl0sh5nc4u; path=/; domain=.saramin.co.kr; HttpOnly
    • Set-Cookie: PCID=16093274376214493428782; expires=Thu, 31-Dec-2099 15:00:00 GMT; Max-Age=2493084963; path=/; domain=saramin.co.kr

    클라이언트 측이 PHPSESSIDPCID를 생성하라고 알려주는 헤더입니다. 이 중에 PHPSESSID는 서버에서 클라이언트를 식별할 용도로 생성한 랜덤값입니다.

    브라우저는 Set-Cookie 헤더를 보고 쿠키를 생성하구요. 다음 매 요청마다 (단, path와 domain 조건에 해당할 때만) 쿠키를 같이 보냅니다. 서버에선 요청을 분석해 쿠키의 PHPSESSID 값이 이전 요청과 동일하면 세션도 동일하다라고 판단하죠. 세션이 동일하다라는 것은 쉽게 말해 여러번의 요청이 같은 사람에 의해 발생했다는 의미입니다.

    이렇게 세션이 한 번 생성된 상태에서 로그인을 진행하면, 서버에서 "넌 로그인 했으니까 우리가 알아볼 수 있게 토큰값을 하나 줄게"라고 합니다. 이 토큰은 쿠키에 저장할 수도 있고, 세션스토리지나 로컬스토리지에 저장할 수도 있습니다만, 보통은 쿠키에 저장합니다. 브라우저가 자동으로 처리하니까요.

    토큰을 따로 주지 않는 경우도 있습니다. 어차피 PHPSESSID로 같은 세션인지 아닌지만 판단하고, 로그인 여부는 서버에만 보관해도 되는거니까요.

    어쨋든 로그인 다음부터는 매 요청마다 PHPSESSID와 로그인 토큰을 같이 딸려보내야 합니다. 그래야 서버에서 유효한 세션/로그인인지, 정말 회원이 맞는지 등을 판단해서 응답을 하겠죠.


    ...라는게 대략적인 로그인에 대한 설명인데요. 사실 사이트마다 각자 자기들만의 방식으로 개발을 해놨고, 이 정보는 보안상 당연히 공개가 안되어있으니 브라우저 스토리지를 매 순간 기록하여 분석을 해야하는데요. 쉽지 않은 일입니다. 😥

    그럼에도 어떻게든 구현을 해야 하는 상황이라면, 위에 말씀드린것처럼 응답 패킷을 분석해 쿠키를 생성하고, 만든 쿠키를 던지고, 혹여나 페이지 이동(=리다이렉션)같은 응답 코드가 오면 해당 행동도 해야 하고 하는거죠.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)