질문을 삭제하지 말아주세요.!
 
1
0
-1
세션이 storage 폴더에 framework 밑에 sessions 로 저장 되고 있습니다. index.php파일에서 response 가 생성 되기 전에 session을 가져올 수 없을까요? sessions 아래 저장 되는 세션 파일을 laravel_session 쿠키 값으로 가져오면 되는데 laravel_session 쿠키 값으로 sessions의 파일명을 가져오려면 decrypt 를 어떻게 해야 하나요?
    CommentAdd your comment...

    3 answers

    1.  
      2
      1
      0

      우선 public/index.php 파일에 코드를 추가하는건 그다지 추천드리지 않습니다. 

      라우팅 과 Controller 를 구성하셔서 처리하시는데 로직을 추가하는게 좋습니다.

      그리고 session 은 file session 인 경우에는 파일로 저장되지만, memcache 나 redis 경우에는

      파일로 남지 않습니다. 

      질문주신내용을 명확하게 이해하기가 어려운데, 어떤 작업을 진행하시는데 사용하시려는지 배경을 좀 더

      상세히 설명해주시면 도움이 되는 답변 드리겠습니다. 

      1. bosskmk

        이미지를 출력 시키는 데, 이미지가 로그인 하지 않으면 노출 되지 않아야 합니다.

        때문에 세션을 체크하는데, 세션 체크 로직을 포함 시키기 위해 콘트롤러에서 

        $file = \File::get(\Storage::getDriver()
              ->getAdapter()
              ->getPathPrefix()."public/upload/".$path."/".$fileName);
        
                 return response($file, 200)->header('Content-Type', 'image/jpeg');

        위와 같이 이미지를 리턴 시키는 걸 테스트 했는데, docker환경에서 

        이미지 하나 응답받는데 TTFB 가 500~600ms 입니다.

        docker가 아닌 윈도우에서 xampp 로 실행해보면 200~300ms 입니다.

        docker가 host 의 파일을 공유하는 과정에서 부하가 걸리는지...

        아무튼 index.php 에서 response 인스턴스 생성 전에 테스트를 해보니 300ms정도 줄었습니다.(docker에서)


        세션 가져오는 것은 

        Encrypter 클래스 생성하고 어찌어찌 해서 해결 했는데, 이게 말씀하신대로 

        근본적인 해결책이 될 거 같지 않네요.


        다른 좋은 방법이 있으시면 추천 부탁드리겠습니다.


      CommentAdd your comment...
    2.  
      1
      0
      -1

      이미지를 출력하기 위한 라우트를 작성하셨고, 로그인 하지 않은 사람에게는 이미지를 보여주고 싶지 않다면 auth 미들웨어를 사용하면 되지 않을까요?

      Route::get('images/{filename}', function ($filename) {
      
      
          //storage/img/ 디렉토리에 test.jpg 를 넣고 실험해봤습니다.
          $path = storage_path() . '/img/' . $filename;
      
          if(!File::exists($path)) abort(404);
      
          $file = File::get($path);
          $type = File::mimeType($path);
          
          return response($file, 200)->header('Content-Type', $type);
      });

      댓글로 미루어보아 위와 비슷한 라우트를 작성하셨을 것 같은데요,

      다음과 같이 auth 미들웨어를 적용하는 것만으로 로그인한 사용자만 해당 이미지를 얻을 수 있도록 제어할 수 있습니다.

      Route::get('images/{filename}', function ($filename) {
          $path = storage_path() . '/img/' . $filename;
      
          if(!File::exists($path)) abort(404);
      
          $file = File::get($path);
          $type = File::mimeType($path);
          
          return response($file, 200)->header('Content-Type', $type);
      })->middleware('auth');
      1. bosskmk

        문제는 라우트 까지 도달하는데 불필요한 과정이 포함되어있어서 이미지 응답속도 저하가 발생하는 것 입니다. 


        때문에 아래와 같이

        1.세션체크

        2.파일 불러오기

        3.파일 출력


        필요한 과정만 이미지 출력에 포함시키려고 하다보니 가장 쉽게 생각 할 수 있는게

        index 페이지에 별도 처리 과정을 넣는 것이었습니다.


        이미지가 한두개면 별 문제가 없지만 한 페이지당 이미지를 15개씩 불러와야 해서 그렇습니다.

        한 호출 당 300~500 ms 가(제 개발 환경 기준) 낭비가 되는 것이죠.

      2. 이현석

        음 라라벨을 부팅하는 과정에서 발생하는 속도 저하가 문제군요.

        그러면 URL rewrite 할 때 이미지 파일은 index.php 가 아닌 별도의 파일을 향하도록 해서 라라벨 자체를 부팅시키지 않는건 어떨까요?

      CommentAdd your comment...
    3.  
      1
      0
      -1

      이미지가 document_root 아래에 위치하고 있는데 굳이 애플리케이션에서 파일의 내용을 읽어서 마임타입을 지정한 후 HTTP 응답을 만들 필요가 있을까요? 이미지 응답을 웹 서버에 위임하고 컨트롤러나 뷰 레이어에서 로그인에 따라 이미지 출력 여부를 제어하는 것이 좋을 것 같습니다.

      // SomeController.php
      
      
      public function foo ()
      {
      	$imageUrl = '/upload/default.png';
      
      
      	if (auth()->check) {
      		$path = '...';
      		$fileName = '...';
      		$imageUrl = "/upload/{$path}/{$fileName}";
      	}
      
      
      	return view('foo', ['imageUrl' => $imageUrl]);
      }
      1. bosskmk

        이미지는 storages 폴더 하위에 있습니다.

        이미지 접근 url이 노출 되어도 세션이 없으면 노출되지 않아야 해서, 이미지는 public 에 두지 않았습니다.

        경로가 public 으로 되어있어서 document root 라고 질문의 오해가 좀 있었네요.

        답변 감사드립니다.

      2. 이현석

        이미지를 출력하는데, 이미지가 public 디렉토리 하위에 있지 않다면 이미지 조회하는 라우트를 만드셨겠군요? 맞나요?

      3. bosskmk

        네, 이미지가 document root에서 접근할 수 없고 이미지를 가져와서 출력시켜주는 라우트를 처음에 만들어서 써봤는데, 이미지 한 건 마다, 라라벨 프로세스를 모두 거쳐야 해서 느리더라구요.

        이미지 호출 하나에 500~800 ms 가 걸리는데 index에서 바로 이미지를 가져와서 출력시켜주니 200 ms로 정도로 줄었습니다.


        다만, 지금은 시연하는 과정에서 개발 PC에서 구동되어 이렇게 임시방편으로 처리하지만

        실제 서비스에서는 방법을 좀 더 고민해 봐야겠습니다.



      CommentAdd your comment...