laiel
265
2019-03-07 14:08:04 작성 2019-03-12 23:02:27 수정됨
57
1259

첨부파일 다운로드


첨부파일 다운로드를 다음과 같은 방식으로 진행했습니다.

해당 파일을 열었을 시에 다음과 같이 잘못된 접근입니다 라는 파일로 열리게 됩니다..

다운로드 method 방법의 문제일까요?

     let options = {
        method: 'GET',
        url: URL,
headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.1' } };
0
0
  • 답변 57

  • 얻으민
    853
    2019-03-07 14:46:26

    저기 접근하려면 로그인해야 될 것 같네요. 로그인 한 상태처럼 요청해야될 것 같습니다.


    로그인된 계정에서 쿠키를 가져와서 그 쿠키를 넣고 요청해보세요.

    0
  • laiel
    265
    2019-03-07 14:48:16 작성 2019-03-11 22:23:57 수정됨

    로그인 계정의 쿠키는 어떤거 말씀하시는거죠?

    0
  • 얻으민
    853
    2019-03-07 14:51:46

    제가 지금은 컴퓨터를 못하고.. 퇴근하고 시도해보겠습니다. :)

    1
  • 얻으민
    853
    2019-03-07 19:47:50

    laiel


    퇴근했습니다. 답변드립니다.



    해당 페이지에 들어가서 쿠키를 보시면(저는 확장프로그램 사용했지만 개발자 도구에서 쿠키 확인해보셔도 됩니다.) PHPSESSID가 있습니다.

    여기서 문제가 되는건 이 PHPSESSID가 없는 경우에 발생하는 문제입니다.

    확인한 방법은 PHPSESSID 쿠키를 제거한 후 시도해 보았더니 같은 에러메시지가 떴습니다.





    해결 방법은 요청에 적합한 PHPSESSID를 집어넣어 주시는 겁니다.


    여기서 PHPSESSID를 가져오시려면 다음과 같은 순서로 하셔야됩니다.


    1. 요청을 2번 해서 첫번째 요청에는 단순히 http://www.jbsos.or.kr로 접속하여 Set-Cookie로 딸려오는 PHPSESSID를 변수에 저장한다.


    2. 두번째 요청에서는 첫번째 요청에서 저장해둔 PHPSESSID를 Cookie에 첨부하여 보내준다.


    3. 정상적으로 파일이 다운로드 된다.




    번외로 php session의 특성상 서버에서 발급한 세션이 아니라고 하더라도, 한번 요청된 쿠키값은 서버에서 그 쿠키값에 대한 세션을 유지합니다.

    때문에 임의로 PHPSESSID 쿠키값을 'a'라고 지정하신 후, 해당 요청을 한번 더 하시면 서버에서는 해당 쿠키를 유효한 쿠키로 인식하여 다운로드를 시켜줄겁니다.


    아마 크롤링에 대해 공부하고 계신 듯 한데, 쿠키를 집어넣어서 요청하는 것은 혼자서도 하실 수 있을 거라고 생각합니다. :)

    1
  • 얻으민
    853
    2019-03-07 20:25:44

    +

    혹시 크롤링 하시려는게 아니라 개발자로서 첨부파일 링크를 공유했을 때 링크를 받은 사람이 못 여는 문제에 대한 것이라면 해당 URL에 대한 PHP 세션 체크를 하지말아주셔야 됩니다.

    물론 첨부파일 중에 권한이 필요한 첨부파일은 DB에서 따로 컬럼을 만들어서 관리를 해야겠습니다.

    1
  • laiel
    265
    2019-03-07 22:18:31 작성 2019-03-12 23:00:16 수정됨

    Php sessid 값은 임의로 a두어도 상관없는건거요? 개발자 도구에서 쿠키값을 가져온값으로 두어야되나요?

    0
  • 얻으민
    853
    2019-03-08 09:00:46

    저 요청으로 단순 다운로드만 할 수 있도록 구현하시려는거면 a라고 쿠키 설정하고 두번 요청하시면 해결됩니다 ^^ 하시려는게 정확히 어떤건지 알려주시면 다시 답변 드리겠습니다.


    크롬 개발자 도구에서 자바스크립트로 다운로드를 하는 코드를 작성하고 싶으신 건가요?

    아니면 node.js에서 작성하시려는건지 알려주세요~ 해당 부분 전체적인 코드도 알려주시면 좋을 것 같습니다.

    0
  • 얻으민
    853
    2019-03-08 10:48:33

    아하

    redis에 php session 값을 저장하실 필요 없습니다.

    아마 저장된 php session의 유효시간은 30분~1시간 일 것이기 때문에 저장하시는게 의미가 없고, 차라리 계속 같은 쿠키(a)로 요청하시는게 좋을겁니다.

    중요한건 첨부파일을 다운로드 하기 전에 반드시 a라는 쿠키를 유효한 쿠키로 만들어 주기 위해 php session 쿠키 값을 a라고 넣은 뒤 서버에 요청을 한번 보내셔야 된다는 겁니다.(이 과정이 없으면 첫번째 요청하는 첨부파일 다운로드는 누락될겁니다. 그 후 두번째부터는 다운로드가 될거구요..)

    0
  • 얻으민
    853
    2019-03-08 11:03:07
    PHPSSESID=a가 되어야겠죠. 쓰고계신 request 모듈에서 cookie 달아서 요청하는 부분 참고해서 코드를 작성하셔야해요
    0
  • laiel
    265
    2019-03-08 11:06:54 작성 2019-03-12 23:01:39 수정됨

    다음과 같이 사용하고 있습니다!

    const fs = require('fs');
    const request = require('request')
    const {promisify} = require('util');
    
        let options = {
            method: 'GET',
            url: URL,
    headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.1' }, };
    0
  • 얻으민
    853
    2019-03-08 11:25:21

    cookie : 'PHPSSESID=1' 이 맞을 겁니다. ㅠ

    제가 폰으로 하고 있는거라 문서를 찾아보긴 어렵네요..

    0
  • laiel
    265
    2019-03-08 11:36:26 작성 2019-03-08 12:11:53 수정됨

    알려 주신 방법으로 정말 해결해보고 싶은데..부족한 점이 있는지

    let options 구문에 cookies : PHPSSESID = 1 를 넣어 줘도 파일이 제대로 받아지지 않아요..ㅜㅜ


    0
  • 얻으민
    853
    2019-03-08 11:58:36

    https://github.com/request/request/blob/master/README.md#requestcookie

    요거 참고해보세요.

    0
  • 얻으민
    853
    2019-03-08 12:56:23
    1
  • laiel
    265
    2019-03-08 13:13:56 작성 2019-03-11 14:52:40 수정됨

    cookieJar 를 만들어 주고 options 부분에 jar 로 cookieJar를 넣어 줬는데 쉽게 되지 않네요...ㅜㅜ

    0
  • 얻으민
    853
    2019-03-08 13:29:12

    저기 문자열을 빽 쿼터랑 싱글쿼터 둘다 넣으시면 안됩니다 ㅜ

    0
  • 얻으민
    853
    2019-03-08 14:57:31
    같은코드 작성해보면 좋은데 제가 오늘 야간까지 근무입니다 ㅎ... 내일 오전에 해보겠습니다.
    1
  • laiel
    265
    2019-03-09 11:46:53

    생각보다 쉽게 되지 않네요ㅠㅠ 얻으민님 영상들 구독했는데 정말 알찬거 같아요ㅜㅜ

    다시 시도중인데..쿠키가 생각보다 많이 어렵네요ㅠ

    쿠키로 해결되면 정말..좋을거같은데ㅜㅜ

    0
  • 얻으민
    853
    2019-03-09 18:40:08
    밤새서 퇴근하고 자다가 지금 일어났네요 ㅎ.. 현재 코드 좀 알 수 잇을까요
    0
  • laiel
    265
    2019-03-09 20:39:48 작성 2019-03-11 14:52:16 수정됨

    options 안에 쿠키값을 넣어서 다른 방법으로 해도 구조가 잘못된같아요ㅠㅠ

    0
  • 얻으민
    853
    2019-03-09 21:15:19

    해결했습니다.


    const request = require('request')
    
    let cookieJar = request.jar();
        cookieJar.setCookie(`PHPSESSID=a; path=/; domain=jbsos.or.kr`, 'http://www.jbsos.or.kr');
        let options = {
            jar:cookieJar,
            method: 'GET',
            url: `http://www.jbsos.or.kr/bbs/download.php?bo_table=support&wr_id=88&no=0`,
            headers: {
                userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
            }
        };
    
        const req = request(options, (err, res, body) => {
            console.log(err);
            console.log(body);
        });
    
    

    'User-Agent' 를 userAgent로 바꿔주세요.

    그리고 사용하고 계신 userAgent 값이 너무 옛날 값입니다. 최신 userAgent로 바꿔주세요.

    1
  • 얻으민
    853
    2019-03-09 21:18:13

    그리고 User-Agent를 아예 지워줘도 되네요 ㅎ

    0
  • laiel
    265
    2019-03-09 21:25:50

    제가 지금 지방에 내려가게 되서 월요일쯤에 해보고 알려드릴께요!!정말 감사합니다!!

    1
  • laiel
    265
    2019-03-11 08:50:10 작성 2019-03-11 09:00:06 수정됨

    알려주신 코드 진행시 다음과 같이 console 창에 나타납니다..ㅜㅜ

    다운로드된 파일을 열어 보면 console.log 창에 뜬 화면 처럼 열리네요

    0
  • 얻으민
    853
    2019-03-11 09:47:42

    두번째 실행시켜도 마찬가진가요

    0
  • laiel
    265
    2019-03-11 09:53:41

    네ㅠㅠ다시 돌려봐도 받아진 파일을 열어 보면 다음과 같네요 ㅠㅠ

    0
  • 얻으민
    853
    2019-03-11 09:54:38

    저 위에코드 두번 돌려보실래요 제가 했을땐 너무 잘 돼서..

    0
  • laiel
    265
    2019-03-11 10:08:12 작성 2019-03-11 15:02:37 수정됨

    cookie 부분에 PHPSESSID 값을 a 에서 사이트에 있는 값으로 변경해서 돌려도 마찬가지네요ㅠㅠ

    cookieJar.setCookie(`PHPSESSID=a; path=/; domain=`, 'http://');
    0
  • 얻으민
    853
    2019-03-11 10:09:33

    네 ㅠ 잘 됐는데ㅠ지금 안된다고 하시면 테스트 해볼수가 없네요 ㅎ... 저녁에 가능합니다.

    1
  • laiel
    265
    2019-03-12 09:44:46

    해결됐습니다!감사합니다!!!공부하는데 많은 도움됐습니다!

    0
  • laiel
    265
    2019-03-12 10:50:32

    여러개의 download.php 링크를 가져다가 쓸때는 구현되지가 않네요 ㅠㅠ

    0
  • 얻으민
    853
    2019-03-12 11:07:06

    엥.. 여러개일때 안되는건 왜그럴지 ㅎ..

    0
  • laiel
    265
    2019-03-12 11:09:12
    그 옵션값에 ulr로 해당 파일의 링크를 넣어줬었는데 여러개의 링크를 async 로 불러와서 할 경우에는 cookie 값을 set 하지 못하는거 같아요 ㅠㅠ
    0
  • laiel
    265
    2019-03-12 12:32:32

    링크들을 한곳에 저장해두고서 그 저장된 링크들을 options url 에서 부를 경우에는 cookie 적용이 되지 않는가요?

    0
  • 얻으민
    853
    2019-03-12 12:54:45

    비동기로 하고 계시면 순서의 차이일 것 같은데.. 코드 좀 볼 수 있을까요

    0
  • laiel
    265
    2019-03-12 13:19:51 작성 2019-03-12 23:03:50 수정됨

    options 에 urlqs 가 링크들을 따로 저장해둔 값입니다!

    주석 처리 해놓은 await cookieJar 를 풀면 링크 하나는 제대로 받아지는데 그다음부터는 cookie 값이 사라지는거 같습니다!

    setCookie 값에 expires 값을 주어도 마찬가지네요..

        let cookieJar = request.jar();                                          
        cookieJar.setCookie(`PHPSESSID=; path=/; domain=`, 'http://')
    
        //await cookieJar
        let options = {
            jar : cookieJar,            
            method: 'GET',
            url: URL,
            headers: {
                userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36' 
            }
        };


    0
  • 얻으민
    853
    2019-03-12 13:22:41

    엥 저기에 어웨이트 쿠키자는 왜 넣으신거죠??

    0
  • laiel
    265
    2019-03-12 13:35:40 작성 2019-03-12 15:23:20 수정됨

     await 를 넣어 보니 한개는 되는데 한개 끝나고 나서 그다음꺼는 그대로 안되네요..

    0
  • 얻으민
    853
    2019-03-12 13:43:51
    await 저렇게 쓰시면 안됩니다. ㅠ request 하는 부분에 붙여야합니다.
    0
  • laiel
    265
    2019-03-12 14:59:04 작성 2019-03-12 23:04:12 수정됨


     let cookieJar = request.jar();                                         
        cookieJar.setCookie(`PHPSESSID=a; path=/; domain=`, 'http://www.')
    
        let options = {
            jar:cookieJar,
            method: 'GET',
            url: URL,
            headers: {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.1'
            }
        };
    
    

    cookie jar 옵션에 혹시 date 정보도 추가 해줘야될까요?한번 인식되고서 사라지는거 같네요 ㅠㅠ

    0
  • 얻으민
    853
    2019-03-12 15:18:11

    지금 코드 한줄한줄 어떤 의미인지 알고 작성하신 것 맞나요..? await의 의미랑 cookieJar가 뭔지 아셨으면 작성될 수 없는 코드입니다.

    0
  • laiel
    265
    2019-03-12 15:24:02

    네..expires 구문 추가해보다가 혼동됐습니다.

    0
  • 얻으민
    853
    2019-03-12 16:45:01

    요청마다 쿠키 Jar로 달아주시면 됩니다. :)

    1
  • seacont
    34
    2019-03-12 16:56:04

    laiel님께서 제 댓글을 추천해주셔서 감사한 마음에 닉네임을 클릭하여 링크를 타다가 여기를 보게됐네요. 얻으민 님께서 설명을 잘 해주셨는데 제가 조금 추가해보자면, 첨부파일을 GET 요청할 때에는 서버에서 전송한 쿠키 3개가 필요한데 이 중 PHPSESSID 쿠키값은 게시물 URL을 이용해 생성되는 것 같습니다. 따라서 첨부파일을 GET 요청할 때는 해당 첨부파일이 포함된 게시물의 URL을 이용해 생성된 쿠키값이랑 해서 3개를 포함해주시면 될거에요.

    const request = require("request")
    const util = require("util")
    const r = util.promisify(request.defaults({jar: true}))
    const base = "http://www.jbsos.or.kr/bbs/board.php?bo_table=support&wr_id="
    
    async function download(urls) {
      for (var i = 0; i < urls.length; i++) {
        var id = urls[i].match(/(?:wr_id=)(\d\d)/)
        await r(base + id[1], {resolveWithFullResponse: true})
          .then(res => {
            return r(urls[i], {resolveWithFullResponse: true})
          })
          .then(res => {
            console.log(res.headers["content-disposition"])
          })
          .catch(err => {
            console.log(err)
          })
      }
    }
    
    download([
      "http://www.jbsos.or.kr/bbs/download.php?bo_table=support&wr_id=88&no=0",
      "http://www.jbsos.or.kr/bbs/download.php?bo_table=support&wr_id=88&no=1",
      "http://www.jbsos.or.kr/bbs/download.php?bo_table=support&wr_id=87&no=0"
    ])


    참고로 Q&A에서 문제가 해결된 글의 제목 및 본문이 편집되어버리면 나중에 비슷한 문제를 겪는 사람들이 해당 글을 찾지 못해 또 새롭게 질문을 하고 새롭게 답변이 달려야 하는 문제가 발생할 수 있을 것 같네요.

    2
  • laiel
    265
    2019-03-12 17:02:52
    감사합니다!!!그때 알려주신 방법으로 정말..너무 감사했어요!jar true 라는 값을 새롭게 알게 되서 얼마나 기뻤는지..감사합니다!!
    0
  • 얻으민
    853
    2019-03-12 17:03:32

    깔끔한 코드입니다. ^^

    0
  • laiel
    265
    2019-03-12 17:20:16

    searcont님 죄송하지만 PHPSESSID 쿠키값 이외의 2개가 더 필요하다고 하신거죠?ㅠㅠ

    0
  • seacont
    34
    2019-03-12 17:36:08

    얻으민님 감사합니다. 끝까지 도와주시는 모습에 감동받았습니다 ^^

    laiel님, 네 크롬 개발자 모드 가서 보시면 2개를 더 확인할 수 있을텐데요, 이건 URL에 관계없이 동일한 것 같아요. 그런데 request 옵션에 {jar: true}를 넣어주시면 request가 첫 요청 때 받은 쿠키를 모두 다음 요청 때 자동으로 포함해주니 신경 안쓰셔도 될거에요 ^^

    1
  • laiel
    265
    2019-03-12 17:49:09

    두분다 정말 감사합니다!!학생신분으로 공부하기에 너무나 막막했는데 이렇게 배울수 있어서 영광입니다!!

    1
  • laiel
    265
    2019-03-13 08:36:07 작성 2019-03-13 16:11:16 수정됨


    const connectInfo = require('./config').redisConfig;
    const client = require('./redisHelper').init(connectInfo);
    
    const fs = require('fs');
    const util = require("util")
    const request = require('request').defaults({jar: true})
    const {promisify} = require('util');
    
     let cookieJar = request.jar();
        cookieJar.setCookie(`PHPSESSID=413d9a9b27043c68849b953c8ca30df6;  path=/; domain=.kr`, 'http://www')
        cookieJar.setCookie(`e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;  path=/; domain=.kr`, 'http://www')
        cookieJar.setCookie(`2a0d2363701f23f8a75028924a3af643=MjExLjIwNi44MC4xMzQ%3D;  path=/; domain=.kr`, 'http://www')
    
        let options = {
            jar: cookieJar,
            method: 'GET',
            url: URL,
            headers: {
                userAgent: 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.1'
            }
        };

    말씀하신 방법이 이게 맞을까요?정상작동을 하지 않는데 쿠키가 또 문제일까요?ㅜㅜ

    0
  • laiel
    265
    2019-03-13 10:10:58

    default 값에 잘못 값을 입력해서일까요? ㅜㅜ

    .defaults({jar: true})
    0
  • seacont
    34
    2019-03-13 11:52:28

    아래 두 코드를 삭제하고 해보세요.

    let cookieJar = request.jar();
        cookieJar.setCookie(`PHPSESSID=413d9a9b27043c68849b953c8ca30df6;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
        cookieJar.setCookie(`e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
        cookieJar.setCookie(`2a0d2363701f23f8a75028924a3af643=MjExLjIwNi44MC4xMzQ%3D;;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
    jar: cookieJar,


    0
  • laiel
    265
    2019-03-13 12:00:34

    seacont 님..그래도 파일이 잘못된 접근입니다의 내용으로 받아집니다.. ㅠㅠ

    0
  • seacont
    34
    2019-03-13 12:18:14

    request 호출까지 포함된 소스코드를 보면 제가 도움을 드릴 수 있을 것 같네요.

    0
  • laiel
    265
    2019-03-13 13:36:02 작성 2019-03-13 16:10:27 수정됨

    해당 코드에서 "downladLinks" 값은 첨부파일 링크들에 대해서만 한번에 모아 두었습니다!

    const connectInfo = require('./config').redisConfig;
    const client = require('./redisHelper').init(connectInfo);
    
    const fs = require('fs');
    const request = require('request').defaults({Jar: true})
    const {promisify} = require('util');
    
      let cookieJar = request.jar()
        cookieJar.setCookie(`PHPSESSID=413d9a9b27043c68849b953c8ca30df6;e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;  path=/; domain=`, 'http://www.')
        cookieJar.setCookie(`e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;  path=/; domain=.kr`, 'http://www')
        cookieJar.setCookie(`2a0d2363701f23f8a75028924a3af643=MjExLjIwNi44MC4xMzQ%3D;  path=/; domain=.kr`, 'http://www')
    
    
        let options = {
            jar: cookieJar,
            method: 'GET',
            url: downladLinks,
            headers: {
                userAgent: 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.1'
            },
        }
    
        const req = request(options, (err, res, body) => {
            console.log(err);
            console.log(body);
        }).pipe(file);
    
    0
  • seacont
    34
    2019-03-13 15:04:25 작성 2019-03-13 15:09:11 수정됨

    제점

    웹브라우저에서는 게시판에서 게시물을 먼저 들어간 다음, 게시물 안의 첨부파일을 누릅니다. 이 과정을 수행해야지만 서버에서는 정상적인 접근이라고 생각하고 파일을 보내줍니다. 즉,

    1. http://www.jbba.kr/bbs/board.php?bo_table=sub01_09&wr_id=67 에 대한 GET 요청 (게시물)
    2. http://www.jbba.kr/bbs/download.php?bo_table=sub01_09&wr_id=67&no=0 에 대한 GET 요청 (첨부파일)

    위의 순서대로 해야 서버에서는 잘못된 접근이라고 하지 않습니다. 그런데 HTTP 프로토콜은 stateless 라서 서버에서는 1번 요청과 2번 요청이 같은 웹브라우저에서 순서대로 이루어졌는지 원래는 알 수 없어야 합니다. 이것을 알 수 있게 해주는 것이 쿠키입니다. 서버에서는 1번 요청을 받을 때 Set-Cookie 헤더를 통해 쿠키를 전송합니다. 이후 웹브라우저에서 2번 요청을 할 때 Cookie 헤더에 아까 1번 요청시 받은 쿠키를 포함하여 요청을 하면 서버에서는 이 요청이 1번 요청의 후속 요청이라는 것을 알게 됩니다.

    $ curl -v -o /dev/null "http://www.jbba.kr/bbs/board.php?bo_table=sub01_09&wr_id=67"

    위의 명령어를 실행해보시면 Set-Cookie 헤더에 PHPSESSID, e1192aefb64683cc97abb83c71057733, 2a0d2363701f23f8a75028924a3af643 쿠키가 포함된 것을 확인할 수가 있습니다. 또한 여러번 실행해보시면 PHPSESSID 값이 매번 바뀌는 것을 확인할 수 있습니다.

    laiel님의 코드에는 1번 요청에 대한 내용이 없고, 1번 요청시 서버에서 전송하는 쿠키를 저장하는 내용이 없고, 이후 2번 요청시 해당 쿠키를 포함하는 내용이 없습니다. 대신 서버에서 1번 요청과 관련없는 요청 때 전송해준 쿠키를 2번 요청에 포함하고 있습니다. 따라서 서버에서는 게시물을 눌렀다가 첨부파일을 누른 것이 아닌 것으로 판단하여 잘못된 접근이라는 에러를 표시하는 것입니다.


    해결방법

    1. 아래 코드를 삭제하세요. (쿠키를 손수 작성하지 마시고, 서버에서 준 쿠키를 그대로 사용하세요.)

      let cookieJar = request.jar()
        cookieJar.setCookie(`PHPSESSID=413d9a9b27043c68849b953c8ca30df6;e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
        cookieJar.setCookie(`e1192aefb64683cc97abb83c71057733=c3ViMDFfMDk%3D;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
        cookieJar.setCookie(`2a0d2363701f23f8a75028924a3af643=MjExLjIwNi44MC4xMzQ%3D;  path=/; domain=.jbba.kr`, 'http://www.jbba.kr/bbs/board.php?bo_table=sub01_09')
    
            jar: cookieJar,

    2. {Jar: true}를 {jar: true}로 바꿔주세요.

    3. 1번 요청을 하는 코드를 추가하세요.

    request("http://www.jbba.kr/bbs/board.php?bo_table=sub01_09&wr_id=67", (err, res, body) => {
    })

    4. 2번 요청을 하는 코드를 위의 코드의 콜백 안에 넣으세요. request.defaults({jar: true})를 해주었기 때문에 1번 요청시 서버로부터 받은 쿠키는 자동으로 저장되어 있다가 2번 요청을 하는 코드에 있는 request 호출시 자동으로 Cookie 헤더에 포함됩니다.

    request("http://www.jbba.kr/bbs/board.php?bo_table=sub01_09&wr_id=67", (err, res, body) => {
      const req = request("http://www.jbba.kr/bbs/download.php?bo_table=sub01_09&wr_id=67&no=0", (err, res, body) => {
        console.log(err);
        console.log(body);
      }).pipe(file);
    })

    위에 보시는 바와 같이 1번 요청의 URL에 포함된 wr_id=67 와 2번 요청의 URL에 포함된 wr_id=67 는 동일해야 합니다.

    5. downloadLinks에 포함된 여러 URL에 대해 파일 다운로드 GET 요청을 하시려면, 각각의 요청 전 이에 해당하는 게시물 URL에 대해 GET 요청을 먼저 하신 후 쿠키를 받아서, 이를 포함한 GET 요청을 하셔야 합니다. 이는 제가 downloadLinks의 구조를 몰라 도와드릴 수 없지만, 며칠 전 쓴 제 댓글의 코드에 있는 정규식을 활용하시면 될거에요.


    이것으로 쿠키를 이용한 요청에 대해 감을 잡으셨으면 좋겠네요!

    1
  • laiel
    265
    2019-03-13 16:09:08

     seacont 님...정말 감사합니다..드디어 해결됐습니다..정말정말 감사합니다..

    쿠키 이용방법에 대해서 정말 까먹지 않을 것 같습니다.


    얻으민님과 seacont 님께 감사드립니다..정말 감사드려요..

    기프티콘이라도 보내드리고 싶습니다..ㅠㅠ정말 감사드려요..

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.