<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>투덜이 개발자</title>
    <link>https://mtoo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 10 Jun 2026 08:28:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>엠투</managingEditor>
    <image>
      <title>투덜이 개발자</title>
      <url>https://tistory1.daumcdn.net/tistory/4756005/attach/635b5c2ffd32483db18c4474e29a1d82</url>
      <link>https://mtoo.tistory.com</link>
    </image>
    <item>
      <title>[PHP] 세션 처리</title>
      <link>https://mtoo.tistory.com/323</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;30분(inactivity) 지나면 강제 로그아웃&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 1) 공통 include 파일: session_guard.php &lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1771918641808&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
// session_guard.php
// 모든 보호가 필요한 페이지/요청의 맨 위에서 include 하세요.

$INACTIVITY_LIMIT = 1800; // 30분 (초)

// 세션 쿠키를 30분 유지로 맞추고 싶다면(선택):
// 브라우저 종료해도 30분 유지가 필요할 때만 사용.
// 보안 요구가 높으면 0(브라우저 종료 시 삭제) 권장.
ini_set('session.cookie_lifetime', (string)$INACTIVITY_LIMIT);

// 세션 시작 전 옵션(선택): PHP 7.4에서도 동작
session_name('SID');
session_start();

// 1) inactivity 체크
$now = time();

if (isset($_SESSION['last_activity'])) {
    $idle = $now - (int)$_SESSION['last_activity'];

    if ($idle &amp;gt; $INACTIVITY_LIMIT) {
        // 만료 처리: 세션 파기 + 쿠키 제거 + 리다이렉트
        session_unset();
        session_destroy();

        // 세션 쿠키 제거
        if (ini_get('session.use_cookies')) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 3600,
                $params['path'] ?? '/',
                $params['domain'] ?? '',
                (bool)($params['secure'] ?? false),
                (bool)($params['httponly'] ?? true)
            );
        }

        // 만료 사유 전달(선택)
        header('Location: /login.php?reason=timeout');
        exit;
    }
}

// 2) 마지막 활동 시간 갱신
$_SESSION['last_activity'] = $now;

// 3) 로그인 여부 체크(예시)
// 로그인 세션키를 쓰는 방식에 맞게 수정하세요.
if (empty($_SESSION['user_id'])) {
    header('Location: /login.php?reason=login_required');
    exit;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1488&quot; data-start=&quot;1463&quot; data-ke-size=&quot;size26&quot;&gt;2) 보호가 필요한 모든 페이지에서 사용&lt;/h2&gt;
&lt;p data-end=&quot;1508&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size16&quot;&gt;예: dashboard.php&lt;/p&gt;
&lt;pre id=&quot;code_1771918676492&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
require_once __DIR__ . '/session_guard.php';

// 여기부터 보호된 컨텐츠
echo &quot;Hello, user #&quot; . (int)$_SESSION['user_id'];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1508&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1508&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; 3) 로그인 처리 예시: login.php (아주 단순) &lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1771918689831&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // TODO: 실제로는 DB/인증 로직 넣기
    $id = trim($_POST['id'] ?? '');
    $pw = trim($_POST['pw'] ?? '');

    if ($id === 'admin' &amp;amp;&amp;amp; $pw === 'pass') {
        // 로그인 성공
        session_regenerate_id(true); // 세션 고정 공격 방지

        $_SESSION['user_id'] = 1;
        $_SESSION['last_activity'] = time();

        header('Location: /dashboard.php');
        exit;
    }

    $error = 'Invalid credentials';
}
?&amp;gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;?php if (!empty($_GET['reason'])): ?&amp;gt;
  &amp;lt;p&amp;gt;Reason: &amp;lt;?= htmlspecialchars($_GET['reason'], ENT_QUOTES, 'UTF-8') ?&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;?php endif; ?&amp;gt;
&amp;lt;?php if (!empty($error)): ?&amp;gt;
  &amp;lt;p style=&quot;color:red;&quot;&amp;gt;&amp;lt;?= htmlspecialchars($error, ENT_QUOTES, 'UTF-8') ?&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;?php endif; ?&amp;gt;

&amp;lt;form method=&quot;post&quot;&amp;gt;
  &amp;lt;input name=&quot;id&quot; placeholder=&quot;id&quot;&amp;gt;
  &amp;lt;input name=&quot;pw&quot; placeholder=&quot;pw&quot; type=&quot;password&quot;&amp;gt;
  &amp;lt;button type=&quot;submit&quot;&amp;gt;Login&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1508&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Program Language/PHP</category>
      <category>PHP 세션 처리</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/323</guid>
      <comments>https://mtoo.tistory.com/323#entry323comment</comments>
      <pubDate>Tue, 24 Feb 2026 16:39:18 +0900</pubDate>
    </item>
    <item>
      <title>VS Code 서버(code-server) 설치</title>
      <link>https://mtoo.tistory.com/322</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;VS&amp;nbsp;Code&amp;nbsp;서버(code-server)&amp;nbsp;설치 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1756434038524&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo curl -fsSL https://code-server.dev/install.sh | sh

sudo systemctl enable --now code-server@[사용자명]&amp;amp;
ex) sudo systemctl enable --now code-server@jhshin

sudo systemctl status code-server@jhshin

#code-server 설치 및 ~/.config/code-server/config.yaml 설정
cat &amp;gt; /home/jhshin/.config/code-server/config.yaml (엔터)
##################################
bind-addr: 127.0.0.1:8080
auth: password
password: [YOUR_PASSWORD]
cert: false
##################################
(Ctrl + C)

sudo systemctl stop code-server@jhshin
sudo systemctl start code-server@jhshin

sudo systemctl restart code-server@jhshin

sudo systemctl status code-server@jhshin&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Code-Server</category>
      <category>VS Code 서버설치</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/322</guid>
      <comments>https://mtoo.tistory.com/322#entry322comment</comments>
      <pubDate>Fri, 29 Aug 2025 11:21:16 +0900</pubDate>
    </item>
    <item>
      <title>이미지 변환 Thumbnail 클래스</title>
      <link>https://mtoo.tistory.com/321</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이미지&amp;nbsp;변환&amp;nbsp;Thumbnail&amp;nbsp;클래스&lt;/p&gt;
&lt;pre id=&quot;code_1748827888549&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	
class Thumbnail {

    /**
     * HEIC 파일을 JPEG로 변환
     *
     * ※ 주의: 서버에 ImageMagick 및 libheif 라이브러리가 설치되어 있어야 함
     *
     * @param string $heicFile 원본 HEIC 파일 경로
     * @return string|false 변환된 JPEG 파일 경로 또는 실패 시 false
     */
    public static function convertHeicToJpeg($heicFile) {
        $jpgFile = preg_replace('/\.heic$/i', '.jpg', $heicFile);

        $cmd = &quot;convert &quot; . escapeshellarg($heicFile) . &quot; &quot; . escapeshellarg($jpgFile);
        exec($cmd, $output, $return_var);

        if ($return_var === 0 &amp;amp;&amp;amp; file_exists($jpgFile)) {
            return $jpgFile;
        } else {
            error_log(&quot;[HEIC 변환 실패] 파일: $heicFile&quot;);
            return false;
        }
    }


    /**
     * 썸네일 이미지 생성
     *
     * @param string $srcFile 원본 이미지 경로
     * @param string $destFile 썸네일 저장 경로 (비우면 자동 생성)
     * @param int $thumbWidth 썸네일 너비
     * @param int|null $thumbHeight 썸네일 높이 (null이면 비율 유지)
     * @param int $quality 저장 품질 (기본 JPEG용)
     * @param bool $cropSquare 정사각형으로 크롭 여부
     * @param array $watermark 워터마크 설정 [file, text, font_path, font_size, text_color, position]
     * @return array|false 썸네일 정보 배열 또는 실패 시 false
     */
    public static function generate(
        $srcFile,
        $destFile = '',
        $thumbWidth = 600,
        $thumbHeight = null,
        $quality = 90,
        $cropSquare = false,
        $watermark = array()
    ) {
        if (!file_exists($srcFile)) {
            error_log(&quot;[Thumbnail Error] Source file not found: $srcFile&quot;);
            error_log(&quot;[Thumbnail Error] Failed to create thumbnail for: $srcFile&quot;);
            return false;
        }

        $size = @getimagesize($srcFile);
        // HEIC 확장자 또는 MIME 검사 시 변환 시도
        $ext = strtolower(pathinfo($srcFile, PATHINFO_EXTENSION));
        $mime = function_exists('mime_content_type') ? mime_content_type($srcFile) : '';
        if ($ext === 'heic' || $mime === 'image/heic') {
            $converted = self::convertHeicToJpeg($srcFile);
            if (!$converted) {
                error_log(&quot;[Thumbnail Error] HEIC 변환 실패: $srcFile&quot;);
                return false;
            }
            $srcFile = $converted;
        }

        $size = @getimagesize($srcFile);
        if ($size === false) {
            error_log(&quot;[Thumbnail Error] Invalid image size for: $srcFile&quot;);
            return false;
        }

        $imageType = $size[2];
        $orientation = 1;
        $srcImage = false;

        switch ($imageType) {
            case IMAGETYPE_JPEG:
                $srcImage = @imagecreatefromjpeg($srcFile);
                if (function_exists('exif_read_data')) {
                    $exif = @exif_read_data($srcFile);
                    if (!empty($exif['Orientation'])) {
                        $orientation = $exif['Orientation'];
                    }
                }
                break;
            case IMAGETYPE_PNG:
                $srcImage = @imagecreatefrompng($srcFile);
                break;
            case IMAGETYPE_GIF:
                $srcImage = @imagecreatefromgif($srcFile);
                break;
            default:
                error_log(&quot;[Thumbnail Error] Unsupported image type for: $srcFile&quot;);
                return false;
        }

        if (!$srcImage) {
            error_log(&quot;[Thumbnail Error] Failed to create image resource from: $srcFile&quot;);
            return false;
        }

        switch ($orientation) {
            case 3: $srcImage = imagerotate($srcImage, 180, 0); break;
            case 6: $srcImage = imagerotate($srcImage, -90, 0); break;
            case 8: $srcImage = imagerotate($srcImage, 90, 0); break;
        }

        $width  = imagesx($srcImage);
        $height = imagesy($srcImage);

        $targetWidth  = $thumbWidth;
        $targetHeight = $thumbHeight !== null ? $thumbHeight : $thumbWidth / ($width / $height);

        $hasWatermark = !empty($watermark['file']) || !empty($watermark['text']);
        $isRotated    = ($orientation !== 1);

        if ($width &amp;lt;= $targetWidth &amp;amp;&amp;amp; $height &amp;lt;= $targetHeight &amp;amp;&amp;amp; !$hasWatermark &amp;amp;&amp;amp; !$isRotated) {
            return array(
                'path'   =&amp;gt; $srcFile,
                'size'   =&amp;gt; filesize($srcFile),
                'width'  =&amp;gt; $width,
                'height' =&amp;gt; $height
            );
        }

        if ($cropSquare) {
            $cropSize = min($width, $height);
            $srcX = ($width - $cropSize) / 2;
            $srcY = ($height - $cropSize) / 2;
            $newWidth = $newHeight = $thumbWidth;
        } else {
            $srcX = 0; $srcY = 0; $cropSize = 0;
            if ($width &amp;lt;= $targetWidth &amp;amp;&amp;amp; $height &amp;lt;= $targetHeight) {
                $newWidth  = $width;
                $newHeight = $height;
            } else if ($thumbHeight === null) {
                $newWidth = $thumbWidth;
                $newHeight = $thumbWidth / ($width / $height);
            } else {
                $ratio = $width / $height;
                if ($thumbWidth / $thumbHeight &amp;gt; $ratio) {
                    $newHeight = $thumbHeight;
                    $newWidth  = $thumbHeight * $ratio;
                } else {
                    $newWidth  = $thumbWidth;
                    $newHeight = $thumbWidth / $ratio;
                }
            }
        }

        $srcW = $cropSize ? $cropSize : $width;
        $srcH = $cropSize ? $cropSize : $height;

        $dstImg = imagecreatetruecolor($newWidth, $newHeight);
        if ($imageType == IMAGETYPE_PNG || $imageType == IMAGETYPE_GIF) {
            imagecolortransparent($dstImg, imagecolorallocatealpha($dstImg, 0, 0, 0, 127));
            imagealphablending($dstImg, false);
            imagesavealpha($dstImg, true);
        }

        imagecopyresampled($dstImg, $srcImage, 0, 0, $srcX, $srcY, $newWidth, $newHeight, $srcW, $srcH);
        self::applyWatermark($dstImg, $newWidth, $newHeight, $watermark);

        if (empty($destFile)) {
            $destFile = self::getDestFile($srcFile, $newWidth, $newHeight);
        }

        $success = false;
        switch ($imageType) {
            case IMAGETYPE_JPEG: $success = imagejpeg($dstImg, $destFile, $quality); break;
            case IMAGETYPE_PNG:  $success = imagepng($dstImg, $destFile); break;
            case IMAGETYPE_GIF:  $success = imagegif($dstImg, $destFile); break;
        }

        if (is_resource($srcImage)) imagedestroy($srcImage);
        if (is_resource($dstImg)) imagedestroy($dstImg);

        if ($success &amp;amp;&amp;amp; file_exists($destFile)) {
            $info = @getimagesize($destFile);
            return array(
                'path'   =&amp;gt; $destFile,
                'size'   =&amp;gt; filesize($destFile),
                'width'  =&amp;gt; $info[0],
                'height' =&amp;gt; $info[1]
            );
        }

        return false;
    }

    // 워터마크 이미지 및 텍스트를 지정된 위치에 적용
    /**
     * 이미지에 워터마크 이미지 또는 텍스트 삽입
     *
     * @param resource $img GD 이미지 리소스
     * @param int $imgW 이미지 너비
     * @param int $imgH 이미지 높이
     * @param array $watermark 워터마크 설정값
     */
    private static function applyWatermark(&amp;amp;$img, $imgW, $imgH, $watermark) {
        $position = isset($watermark['position']) ? $watermark['position'] : 'bottom-right';
        $fontSize = isset($watermark['font_size']) ? $watermark['font_size'] : 12;
        $textColor = isset($watermark['text_color']) ? $watermark['text_color'] : array(255,255,255);

        if (!empty($watermark['file']) &amp;amp;&amp;amp; file_exists($watermark['file'])) {
            $wmImg = @imagecreatefrompng($watermark['file']);
            if ($wmImg) {
                $wmW = imagesx($wmImg);
                $wmH = imagesy($wmImg);
                list($x, $y) = self::getWatermarkPosition($position, $imgW, $imgH, $wmW, $wmH);
                imagecopy($img, $wmImg, $x, $y, 0, 0, $wmW, $wmH);
                imagedestroy($wmImg);
            }
        }

        if (!empty($watermark['text']) &amp;amp;&amp;amp; !empty($watermark['font_path']) &amp;amp;&amp;amp; file_exists($watermark['font_path'])) {
            $color = imagecolorallocate($img, $textColor[0], $textColor[1], $textColor[2]);
            $bbox = imagettfbbox($fontSize, 0, $watermark['font_path'], $watermark['text']);
            $textW = abs($bbox[2] - $bbox[0]);
            $textH = abs($bbox[7] - $bbox[1]);
            list($x, $y) = self::getWatermarkPosition($position, $imgW, $imgH, $textW, $textH);
            $y += $textH;
            imagettftext($img, $fontSize, 0, $x, $y, $color, $watermark['font_path'], $watermark['text']);
        }
    }

    // 워터마크 위치 계산
    /**
     * 워터마크 삽입 위치 계산
     *
     * @param string $position 위치 (top-left, top-right, center, bottom-left, bottom-right)
     * @param int $imgW 이미지 너비
     * @param int $imgH 이미지 높이
     * @param int $markW 워터마크 너비
     * @param int $markH 워터마크 높이
     * @return array [x, y] 좌표값
     */
    private static function getWatermarkPosition($position, $imgW, $imgH, $markW, $markH) {
        switch (strtolower($position)) {
            case 'top-left':     return array(10, 10);
            case 'top-right':    return array($imgW - $markW - 10, 10);
            case 'center':       return array(($imgW - $markW) / 2, ($imgH - $markH) / 2);
            case 'bottom-left':  return array(10, $imgH - $markH - 10);
            case 'bottom-right':
            default:             return array($imgW - $markW - 10, $imgH - $markH - 10);
        }
    }

    // 썸네일 저장 경로 자동 생성
    /**
     * 썸네일 저장 파일 경로 자동 생성
     *
     * @param string $srcFile 원본 이미지 경로
     * @param int $w 최종 저장될 이미지 너비
     * @param int $h 최종 저장될 이미지 높이
     * @return string 저장될 썸네일 경로
     */
    private static function getDestFile($srcFile, $w, $h) {
        $srcDir   = dirname($srcFile);
        $srcName  = pathinfo($srcFile, PATHINFO_FILENAME);
        $srcExt   = pathinfo($srcFile, PATHINFO_EXTENSION);
        $thumbDir = $srcDir . '/thumb';
        if (!is_dir($thumbDir)) @mkdir($thumbDir, 0755, true);
        return &quot;$thumbDir/{$srcName}_&quot; . intval($w) . &quot;x&quot; . intval($h) . &quot;.{$srcExt}&quot;;
    }
}

/*
사용 예시:

1. 기본 썸네일 생성 (600px 너비 기준)
$result = Thumbnail::generate('/upload/photo.jpg');

2. 썸네일 너비 지정 + 크롭
$result = Thumbnail::generate('/upload/photo.jpg', '', 300, null, 90, true);

3. 워터마크 이미지 또는 텍스트 삽입
$result = Thumbnail::generate('/upload/photo.jpg', '', 300, null, 90, false, array(
    'file'       =&amp;gt; '/upload/logo.png',
    'text'       =&amp;gt; '엠투',
    'font_path'  =&amp;gt; '/fonts/NotoSansKR-Regular.ttf',
    'font_size'  =&amp;gt; 14,
    'text_color' =&amp;gt; array(255,255,255),
    'position'   =&amp;gt; 'bottom-right'
));

리턴값 예시:
Array
(
    [path] =&amp;gt; /upload/thumb/photo_300x200.jpg
    [size] =&amp;gt; 21503
    [width] =&amp;gt; 300
    [height] =&amp;gt; 200
)
*/
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Program Language/PHP</category>
      <category>thumbnail 클래스</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/321</guid>
      <comments>https://mtoo.tistory.com/321#entry321comment</comments>
      <pubDate>Mon, 2 Jun 2025 10:31:32 +0900</pubDate>
    </item>
    <item>
      <title>WSL(우분투) 환경에 Laravel(라라벨) 11 설치</title>
      <link>https://mtoo.tistory.com/320</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WSL(우분투) 환경에 Laravel(라라벨) 11 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1747670879449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s https://laravel.build/laraking | bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;해서&amp;nbsp;설치&amp;nbsp;되면&amp;nbsp;최신버전이&amp;nbsp;설치&amp;nbsp;된다.&amp;nbsp;현&amp;nbsp;시점&amp;nbsp;12&amp;nbsp;가&amp;nbsp;설치&amp;nbsp;된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL(우분투) 환경에는 &lt;b&gt;PHP가 설치되어 있지 않아서&lt;/b&gt; Laravel 11을 설치할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 PHP, Composer 를 설치후 Laravel 및 Sail 을 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;PHP&amp;nbsp;8.2&amp;nbsp;설치&amp;nbsp;(권장)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747666164804&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2 php8.2-cli php8.2-common php8.2-mbstring php8.2-xml php8.2-curl php8.2-mysql unzip -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;Composer&amp;nbsp;설치&amp;nbsp;(Laravel&amp;nbsp;설치용)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747666175175&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;설치&amp;nbsp;확인:&lt;/p&gt;
&lt;pre id=&quot;code_1747666182089&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer -V&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&amp;nbsp;Laravel&amp;nbsp;11&amp;nbsp;설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747666188021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /mnt/c/docker
composer create-project laravel/laravel:^11.0 laraking&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;Sail&amp;nbsp;설치&amp;nbsp;(선택)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747666194161&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd laraking

# Sail 설치
composer require laravel/sail --dev

# Sail 설정
php artisan sail:install

# MySQL 선택 후 설치 완료되면
./vendor/bin/sail up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;#php artisan sail:install 설치시 DB 선택을 물어보는데 mysql 을 선택하자. 다른 DB&amp;nbsp; 선택시 .env 설정을 변경해줘야 한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;#&amp;nbsp;docker&amp;nbsp;프로세서&amp;nbsp;확인&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747669730521&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose ps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#기본&amp;nbsp;테이블&amp;nbsp;생성&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747669718323&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./vendor/bin/sail artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;#&amp;nbsp;docker&amp;nbsp;종료&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1747669725383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./vendor/bin/sail down&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;브라우저에서 http://localhost/ 접속하면 Laravel 초기 화면이 보이면 정상적으로 설치가 된거다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;wls 아파치가 실행중이면 종료해주자&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이제&amp;nbsp;http://localhost/&amp;nbsp;접속&amp;nbsp;시&amp;nbsp;라바벨&amp;nbsp;초기&amp;nbsp;화면이&amp;nbsp;나오지&amp;nbsp;않고&amp;nbsp;Apache2&amp;nbsp;Ubuntu&amp;nbsp;Default&amp;nbsp;Page&amp;nbsp;가&amp;nbsp;나온다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Apache&amp;nbsp;설정을&amp;nbsp;Laravel&amp;nbsp;폴더로&amp;nbsp;바꿔줘야&amp;nbsp;한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.&amp;nbsp;Laravel&amp;nbsp;프로젝트&amp;nbsp;디렉토리&amp;nbsp;확인&lt;/b&gt; &lt;br /&gt;예:&amp;nbsp;/mnt/c/docker/laraking/public&amp;nbsp;&amp;larr;&amp;nbsp;여기가&amp;nbsp;index.php가&amp;nbsp;있는&amp;nbsp;루트입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.&amp;nbsp;Apache&amp;nbsp;설정&amp;nbsp;파일&amp;nbsp;열기&lt;/b&gt; &lt;br /&gt;sudo&amp;nbsp;vi&amp;nbsp;/etc/apache2/sites-available/000-default.conf &lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&amp;nbsp;DocumentRoot&amp;nbsp;수정&lt;/b&gt; &lt;br /&gt;DocumentRoot&amp;nbsp;/var/www/html&amp;nbsp;을&amp;nbsp;찾아&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;수정한다. &lt;br /&gt;&lt;br /&gt;DocumentRoot&amp;nbsp;/mnt/c/docker/laraking/public &lt;br /&gt;&amp;lt;Directory&amp;nbsp;/mnt/c/docker/laraking/public&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AllowOverride&amp;nbsp;All &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Require&amp;nbsp;all&amp;nbsp;granted &lt;br /&gt;&amp;lt;/Directory&amp;gt; &lt;br /&gt;&lt;b&gt;중요:&amp;nbsp;AllowOverride&amp;nbsp;All&amp;nbsp;설정을&amp;nbsp;해야&amp;nbsp;.htaccess가&amp;nbsp;적용되어&amp;nbsp;Laravel&amp;nbsp;라우팅이&amp;nbsp;작동합니다.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;4.&amp;nbsp;Laravel&amp;nbsp;storage&amp;nbsp;권한&amp;nbsp;설정&amp;nbsp;(처음&amp;nbsp;설치&amp;nbsp;시&amp;nbsp;한&amp;nbsp;번만)&lt;/b&gt; &lt;br /&gt;cd&amp;nbsp;/mnt/c/docker/laraking &lt;br /&gt;sudo&amp;nbsp;chmod&amp;nbsp;-R&amp;nbsp;775&amp;nbsp;storage&amp;nbsp;bootstrap/cache &lt;br /&gt;&lt;br /&gt;&lt;b&gt;5.&amp;nbsp;Apache&amp;nbsp;모듈&amp;nbsp;활성화&amp;nbsp;및&amp;nbsp;재시작&lt;/b&gt; &lt;br /&gt;sudo&amp;nbsp;apache2ctl&amp;nbsp;configtest &lt;br /&gt;sudo&amp;nbsp;a2enmod&amp;nbsp;rewrite &lt;br /&gt;sudo&amp;nbsp;systemctl&amp;nbsp;restart&amp;nbsp;apache2 &lt;br /&gt;&lt;br /&gt;이제&amp;nbsp;다시&amp;nbsp;브라우저에서&amp;nbsp;http://localhost/&amp;nbsp;접속하면&amp;nbsp;Laravel&amp;nbsp;초기&amp;nbsp;화면이&amp;nbsp;보여야&amp;nbsp;정상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;DB 를 mariadb 로 설치하였더니 문제가 발생하였다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 막상 접속하면 라라벨 Laravel 초기 화면이 보이지만 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.env 파일을 열어서 다음과 같이 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB_CONNECTION=mysql&lt;br /&gt;DB_HOST=mariadb&lt;br /&gt;DB_PORT=3306&lt;br /&gt;DB_DATABASE=laravel&lt;br /&gt;DB_USERNAME=sail&lt;br /&gt;DB_PASSWORD=password&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 반영을 위해 아래와 같이 실행&lt;/p&gt;
&lt;pre id=&quot;code_1747668341154&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./vendor/bin/sail artisan config:clear
./vendor/bin/sail artisan migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 실행하면 또 에러 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker만 사용하고 Apache 끄기 (권장)&lt;/p&gt;
&lt;pre id=&quot;code_1747668397376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo service apache2 stop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너 프로세서 확인&lt;/p&gt;
&lt;pre id=&quot;code_1747668738969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose ps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너 종료&lt;/p&gt;
&lt;pre id=&quot;code_1747668628285&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./vendor/bin/sail down&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Program Language/PHP</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/320</guid>
      <comments>https://mtoo.tistory.com/320#entry320comment</comments>
      <pubDate>Mon, 19 May 2025 23:48:14 +0900</pubDate>
    </item>
    <item>
      <title>유튜브 플레이 리스트 저장</title>
      <link>https://mtoo.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 방법 1: Export YouTube Playlist 도구 사용 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;296&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://export-youtube-playlist.vercel.app/&quot; data-is-only-node=&quot;&quot; data-end=&quot;70&quot; data-start=&quot;0&quot;&gt;Export YouTube Playlist&lt;/a&gt;는 유튜브 플레이리스트를 CSV, Excel, 텍스트 등 다양한 형식으로 추출할 수 있는 무료 웹 도구입니다.&lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://export-youtube-playlist.vercel.app/?utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;export-youtube-playlist.vercel.app&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;298&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;680&quot; data-start=&quot;310&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;310&quot;&gt;&lt;span&gt;웹사이트에 접속합니다: &lt;a href=&quot;https://export-youtube-playlist.vercel.app/&quot;&gt;https://export-youtube-playlist.vercel.app/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;469&quot; data-start=&quot;351&quot;&gt;&lt;span&gt;플레이리스트 URL을 입력합니다:&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLTb3qGCzYjS0x2btnSEeRYvh20Y_aI7x8&quot;&gt;https://www.youtube.com/playlist?list=PLTb3qGCzYjS0x2btnSEeRYvh20Y_aI7x8&lt;/a&gt;&lt;/li&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;470&quot;&gt;&lt;span&gt;파일 형식을 선택합니다: CSV&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;513&quot;&gt;&lt;span&gt;추출할 항목을 선택합니다: 제목, URL, 길이 등&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;598&quot; data-start=&quot;556&quot;&gt;&lt;span&gt;정렬 옵션을 설정합니다 (선택 사항)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;680&quot; data-start=&quot;599&quot;&gt;&lt;span&gt;Export 버튼을 클릭하여 파일을 다운로드합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 방법 2: Chrome 확장 프로그램 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1711&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/youtube-advanced-playlist/njipopjohbjffopcfebochjnjbejhfpc&quot; data-is-only-node=&quot;&quot; data-end=&quot;135&quot; data-start=&quot;0&quot;&gt;YouTube Advanced Playlist Export&lt;/a&gt;은 유튜브 플레이리스트를 JSON, CSV 또는 TXT 형식으로 추출할 수 있는 크롬 확장 프로그램입니다.&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/youtube-advanced-playlist/njipopjohbjffopcfebochjnjbejhfpc?hl=en&amp;amp;utm_source=chatgpt.com&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Chrome 웹 스토어&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1723&quot; data-start=&quot;1713&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1935&quot; data-start=&quot;1725&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1767&quot; data-start=&quot;1725&quot;&gt;&lt;span&gt;크롬 웹 스토어에서 확장 프로그램을 설치합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1810&quot; data-start=&quot;1768&quot;&gt;&lt;span&gt;유튜브에서 원하는 플레이리스트를 엽니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1853&quot; data-start=&quot;1811&quot;&gt;&lt;span&gt;플레이리스트의 모든 영상을 스크롤하여 로드합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;1935&quot; data-start=&quot;1854&quot;&gt;&lt;span&gt;확장 프로그램 아이콘을 클릭하고, 원하는 형식으로 저장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Etc</category>
      <category>유튜브 플레이 리스트 저장</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/318</guid>
      <comments>https://mtoo.tistory.com/318#entry318comment</comments>
      <pubDate>Mon, 19 May 2025 21:32:52 +0900</pubDate>
    </item>
    <item>
      <title>CentOS Linux 7 modsecurity-crs 적용</title>
      <link>https://mtoo.tistory.com/317</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;CentOS&amp;nbsp;Linux&amp;nbsp;7&amp;nbsp;modsecurity-crs&amp;nbsp;적용&lt;/p&gt;
&lt;pre id=&quot;code_1746775694711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo wget https://github.com/coreruleset/coreruleset/archive/v3.3.4.tar.gz
tar xvfzp v3.3.4.tar.gz

mkdir /etc/httpd/modsecurity-crs
mv coreruleset-3.3.4 /etc/httpd/modsecurity-crs/.

cd /etc/httpd/modsecurity-crs/coreruleset-3.3.4
mv crs-setup.conf.example crs-setup.conf

# OWASP CRS (Core Rule Set) 3.3.4 을 사용하므로 
# &amp;amp;MULTIPART_PART_HEADERS는 ModSecurity v2에서 인식 불가능 
# 파일 이름을 바꿔 비활성화
mv /etc/httpd/modsecurity-crs/coreruleset-3.3.4/rules/REQUEST-922-MULTIPART-ATTACK.conf \
   /etc/httpd/modsecurity-crs/coreruleset-3.3.4/rules/REQUEST-922-MULTIPART-ATTACK.conf.disabled&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi /etc/httpd/modsecurity-crs/coreruleset-3.3.4/rules/REQUEST-949-BLOCKING-EVALUATION.conf&lt;/p&gt;
&lt;pre id=&quot;code_1747016691552&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#SecRule TX:ANOMALY_SCORE &quot;@ge %{tx.inbound_anomaly_score_threshold}&quot; \
#    &quot;id:949110,\
#    phase:2,\
#    deny,\
#    t:none,\
#    log,\
#    msg:'Inbound Anomaly Score Exceeded (Total Score: %{TX.ANOMALY_SCORE})',\
#    tag:'application-multi',\
#    tag:'language-multi',\
#    tag:'platform-multi',\
#    tag:'attack-generic',\
#    ver:'OWASP_CRS/3.3.4',\
#    severity:'CRITICAL',\
#    setvar:'tx.inbound_anomaly_score=%{tx.anomaly_score}'&quot;


# Anomaly Score를 증가시키는 규칙 (setvar 사용)
SecAction &quot;id:949110, phase:2, t:none, pass, nolog, setvar:tx.anomaly_score=+0.5&quot;

# Anomaly Score가 임계값을 초과하면 차단하는 규칙
SecRule TX:ANOMALY_SCORE &quot;@ge 30&quot; \
    &quot;id:949111,\
    phase:2,\
    deny,\
    t:none,\
    log,\
    msg:'Inbound Anomaly Score Exceeded (Total Score: %{TX.ANOMALY_SCORE})',\
    tag:'application-multi',\
    tag:'language-multi',\
    tag:'platform-multi',\
    tag:'attack-generic',\
    ver:'OWASP_CRS/3.3.4',\
    severity:'CRITICAL',\
    setvar:'tx.inbound_anomaly_score=%{tx.anomaly_score}'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi&amp;nbsp;/etc/httpd/conf.d/mod_security.conf&lt;/p&gt;
&lt;pre id=&quot;code_1746775733120&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;IfModule mod_security2.c&amp;gt;
	# ModSecurity Core Rules Set configuration
	IncludeOptional modsecurity.d/*.conf
	IncludeOptional modsecurity.d/activated_rules/*.conf

	# coreruleset-3.3.4 예외 설정 추가
	IncludeOptional /etc/httpd/modsecurity-crs/custom_exceptions.conf
    
	# coreruleset-3.3.4 설정 추가
	IncludeOptional /etc/httpd/modsecurity-crs/coreruleset-3.3.4/crs-setup.conf
	IncludeOptional /etc/httpd/modsecurity-crs/coreruleset-3.3.4/rules/*.conf
   
&amp;lt;/IfModule&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# 예외 설청 추가 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi /etc/httpd/modsecurity-crs/custom_exceptions.conf&lt;/p&gt;
&lt;pre id=&quot;code_1747094648969&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SecRule ARGS_NAMES &quot;@rx ^(contents|cf_footer|irs_info|address_email_info|ksc_time|staff_info)$&quot; \
  &quot;id:110001,phase:1,pass,nolog,\
  ctl:ruleRemoveTargetById=941310;ARGS:contents,\
  ctl:ruleRemoveTargetById=941310;ARGS:cf_footer,\
  ctl:ruleRemoveTargetById=941310;ARGS:irs_info,\
  ctl:ruleRemoveTargetById=941310;ARGS:address_email_info,\
  ctl:ruleRemoveTargetById=932130;ARGS:cf_footer&quot;

SecRule ARGS_NAMES &quot;@rx ^(contents|cf_footer|irs_info|address_email_info|ksc_time|staff_info)$&quot; \
  &quot;id:110002,phase:2,pass,nolog,\
  ctl:ruleRemoveTargetById=941310;ARGS:contents,\
  ctl:ruleRemoveTargetById=941310;ARGS:cf_footer,\
  ctl:ruleRemoveTargetById=941310;ARGS:irs_info,\
  ctl:ruleRemoveTargetById=941310;ARGS:address_email_info,\
  ctl:ruleRemoveTargetById=932130;ARGS:cf_footer,\
  ctl:ruleRemoveTargetById=932130;ARGS:address_email_info,\
  ctl:ruleRemoveTargetById=932130;ARGS:contents,\
  ctl:ruleRemoveTargetById=932115;ARGS:contents,\
  ctl:ruleRemoveTargetById=941180;ARGS:contents,\
  ctl:ruleRemoveTargetById=941310;ARGS:ksc_time,\
  ctl:ruleRemoveTargetById=941310;ARGS:staff_info&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi&amp;nbsp;/etc/httpd/modsecurity-crs/coreruleset-3.3.4/rules/999-whitelist-summernote.conf&lt;/p&gt;
&lt;pre id=&quot;code_1746775778347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 웹 에디터 콘텐츠 업로드 시 예외 처리
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1001,phase:1,nolog,pass,ctl:ruleRemoveById=941100&quot;
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1002,phase:1,nolog,pass,ctl:ruleRemoveById=941130&quot;
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1003,phase:1,nolog,pass,ctl:ruleRemoveById=941140&quot;
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1004,phase:1,nolog,pass,ctl:ruleRemoveById=941160&quot;
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1005,phase:1,nolog,pass,ctl:ruleRemoveById=941170&quot;
SecRule REQUEST_URI &quot;@beginsWith /&quot; &quot;id:1006,phase:1,nolog,pass,ctl:ruleRemoveById=941200&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>OS/Linux</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/317</guid>
      <comments>https://mtoo.tistory.com/317#entry317comment</comments>
      <pubDate>Fri, 9 May 2025 16:29:45 +0900</pubDate>
    </item>
    <item>
      <title>cronolog  설치</title>
      <link>https://mtoo.tistory.com/316</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;cronolog는 로그 파일을 날짜별로 나눠 저장할 수 있게 해주는 외부 유틸리티입니다. Apache 등에서 로그 파일을 날짜별로 회전하려는 경우 종종 사용되며, 직접 설치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cronolog는 오래된 패키지이고 공식 저장소에는 없을 수 있어서, 보통 &lt;b&gt;소스 빌드&lt;/b&gt; 또는 &lt;b&gt;서드파티 저장소&lt;/b&gt;를 이용해 설치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746770285654&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /usr/local/src
wget http://ftp.debian.org/debian/pool/main/c/cronolog/cronolog_1.6.2+rpk.orig.tar.gz
tar zxvf cronolog_1.6.2+rpk.orig.tar.gz
cd cronolog-1.6.2
./configure
make
sudo make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면, cronolog 명령어의 위치를 확인해 보세요:&lt;/p&gt;
&lt;pre id=&quot;code_1746770304941&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;which cronolog&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 설치되었다면, /usr/local/sbin/cronolog와 같은 경로가 출력될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cronolog 설치해서 쓰는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 예시 (Apache)&lt;/p&gt;
&lt;pre id=&quot;code_1746770444560&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CustomLog &quot;|/usr/local/sbin/cronolog /var/log/httpd/access-%Y-%m-%d.log&quot; combined
ErrorLog &quot;|/usr/local/sbin/cronolog /var/log/httpd/error-%Y-%m-%d.log&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>OS/Linux</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/316</guid>
      <comments>https://mtoo.tistory.com/316#entry316comment</comments>
      <pubDate>Fri, 9 May 2025 15:00:56 +0900</pubDate>
    </item>
    <item>
      <title>우분투 Postfix 설치</title>
      <link>https://mtoo.tistory.com/315</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. Postfix 설치&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 중간에 &lt;b&gt;&quot;Postfix Configuration&quot;&lt;/b&gt; 화면이 나타납니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;General type of mail configuration:&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;rarr; Internet Site 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;System mail name:&lt;/b&gt;이 값은 메일 주소의 도메인 부분 (user@example.com)이 됩니다.&lt;/li&gt;
&lt;li&gt;&amp;rarr; 서버의 도메인명을 입력 (예: example.com)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 2. 기본 설정 확인 및 수정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 설정 파일은 /etc/postfix/main.cf에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 시:&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;sudo nano /etc/postfix/main.cf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요 항목 예시:&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;myhostname = mail.example.com
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
inet_interfaces = all
inet_protocols = ipv4
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mail.example.com은 서버의 FQDN(정규화된 도메인명)으로 교체하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. Postfix 재시작&lt;/h3&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;sudo systemctl restart postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 4. 동작 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 메일 발송 테스트:&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;echo &quot;테스트 메일 본문입니다.&quot; | mail -s &quot;테스트 메일 제목&quot; your@email.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 위 명령을 사용하려면 mailutils 설치 필요:&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo apt install mailutils
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>OS/Linux</category>
      <category>postfix 설치</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/315</guid>
      <comments>https://mtoo.tistory.com/315#entry315comment</comments>
      <pubDate>Thu, 8 May 2025 17:16:42 +0900</pubDate>
    </item>
    <item>
      <title>JetBrains PhpStorm세팅 Github 계정으로 동기화</title>
      <link>https://mtoo.tistory.com/314</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JetBrains&amp;nbsp;PhpStorm세팅&amp;nbsp;Github&amp;nbsp;계정으로&amp;nbsp;동기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;github_계정으로_동기화&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Github 계정으로 동기화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;젯브레인 계정으로 하기에는 찝찝하면, 개발자라면 하나씩은 들고 있는 깃헙 계정으로 직접 리포지토리를 생성하여 설정들을 파일로 백업하여 동기화 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 깃헙 계정으로 동기화하는 것은 IDE 설정은 적용되지만&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; 확장 플러그인은 동기화가 안된다는 단점&lt;/span&gt;&lt;/b&gt;이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 &amp;rarr; IDE 설정 관리 &lt;b&gt;&lt;span&gt;&amp;rarr; 설정 저장소(setting repository)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;560&quot; data-origin-width=&quot;811&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVjBSD/btrLDRRNOlL/PDkaTgFLacEirPIPE32h2K/img.png&quot; width=&quot;811&quot; height=&quot;560&quot; data-phocus-index=&quot;13&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bVjBSD/btrLDRRNOlL/PDkaTgFLacEirPIPE32h2K/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVjBSD%2FbtrLDRRNOlL%2FPDkaTgFLacEirPIPE32h2K%2Fimg.png&quot; data-origin-height=&quot;560&quot; data-origin-width=&quot;811&quot; /&gt;&lt;/figure&gt;
&lt;figure data-origin-height=&quot;418&quot; data-origin-width=&quot;791&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckKfzI/btrLEwlPUpc/D1MJS5Xfj3xswNZHg6Xum1/img.png&quot; width=&quot;791&quot; height=&quot;418&quot; data-phocus-index=&quot;14&quot; data-src=&quot;https://blog.kakaocdn.net/dn/ckKfzI/btrLEwlPUpc/D1MJS5Xfj3xswNZHg6Xum1/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckKfzI%2FbtrLEwlPUpc%2FD1MJS5Xfj3xswNZHg6Xum1%2Fimg.png&quot; data-origin-height=&quot;418&quot; data-origin-width=&quot;791&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그러면 깃헙 레포지토리 URL 입력창이 나오는데, 인텔리제이 설정 파일을 보관할 원격 저장소를 깃헙에 가서 따로 생성 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;2.&lt;/span&gt;&lt;span&gt;&lt;span&gt; 깃헙에서&amp;nbsp;&lt;/span&gt;인텔리제이 설정 저장할 레포지터리 생성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;438&quot; data-origin-width=&quot;794&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1kjSn/btrLF2YnC8G/p5AFS9bXUqtp5fidfjC7ik/img.png&quot; width=&quot;794&quot; height=&quot;438&quot; data-phocus-index=&quot;15&quot; data-src=&quot;https://blog.kakaocdn.net/dn/1kjSn/btrLF2YnC8G/p5AFS9bXUqtp5fidfjC7ik/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1kjSn%2FbtrLF2YnC8G%2Fp5AFS9bXUqtp5fidfjC7ik%2Fimg.png&quot; data-origin-height=&quot;438&quot; data-origin-width=&quot;794&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;3.&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;깃헙 레포지터리 주소 등록&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;397&quot; data-origin-width=&quot;1231&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PW5jw/btrLDPs4FhE/tMmuotkeHv2W14zP8YJge0/img.png&quot; width=&quot;1231&quot; height=&quot;397&quot; data-phocus-index=&quot;16&quot; data-src=&quot;https://blog.kakaocdn.net/dn/PW5jw/btrLDPs4FhE/tMmuotkeHv2W14zP8YJge0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPW5jw%2FbtrLDPs4FhE%2FtMmuotkeHv2W14zP8YJge0%2Fimg.png&quot; data-origin-height=&quot;397&quot; data-origin-width=&quot;1231&quot; /&gt;&lt;/figure&gt;
&lt;figure data-origin-height=&quot;418&quot; data-origin-width=&quot;791&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yrdZe/btrLFgW0Tiw/JKoAPurjFEWm0CKxKgmnE1/img.png&quot; width=&quot;791&quot; height=&quot;418&quot; data-phocus-index=&quot;17&quot; data-src=&quot;https://blog.kakaocdn.net/dn/yrdZe/btrLFgW0Tiw/JKoAPurjFEWm0CKxKgmnE1/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyrdZe%2FbtrLFgW0Tiw%2FJKoAPurjFEWm0CKxKgmnE1%2Fimg.png&quot; data-origin-height=&quot;418&quot; data-origin-width=&quot;791&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;4.&lt;/span&gt;&lt;span&gt;&lt;span&gt; 깃헙 토큰을 발급받고 인텔리제이에 등록&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;a href=&quot;https://github.com&quot;&gt; &lt;img src=&quot;https://scrap.kakaocdn.net/dn/KOziK/hyPIOuEGh2/ISQAqEkKGcSZzkSOjaBnk1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cGzbq2/hyPILYYQ76/xeRb5QKz1soTGbf85MpHQK/img.png?width=2496&amp;amp;height=1480&amp;amp;face=0_0_2496_1480,https://scrap.kakaocdn.net/dn/bV3TY5/hyPINP2Bjz/1ZdJZ9lHKmKKMokQUVzij0/img.jpg?width=1238&amp;amp;height=1404&amp;amp;face=0_0_1238_1404&quot; data-src=&quot;https://scrap.kakaocdn.net/dn/KOziK/hyPIOuEGh2/ISQAqEkKGcSZzkSOjaBnk1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cGzbq2/hyPILYYQ76/xeRb5QKz1soTGbf85MpHQK/img.png?width=2496&amp;amp;height=1480&amp;amp;face=0_0_2496_1480,https://scrap.kakaocdn.net/dn/bV3TY5/hyPINP2Bjz/1ZdJZ9lHKmKKMokQUVzij0/img.jpg?width=1238&amp;amp;height=1404&amp;amp;face=0_0_1238_1404&quot; /&gt; &lt;/a&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href=&quot;https://github.com&quot;&gt;GitHub: Where the world builds software&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;i&gt;&lt;/i&gt; github.com&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;GitHub is where over 83 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/GitHub-%F0%9F%8F%9B%EF%B8%8F-%EA%B9%83%ED%97%99-%ED%86%A0%ED%81%B0-%EB%B0%9B%EA%B8%B0&quot;&gt; &lt;img src=&quot;https://scrap.kakaocdn.net/dn/eynRv/hyPIJfMNpn/o2mNV9f8Tx5kIB7iTgKwOk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/AsW7s/hyPIN3AfGG/tLoxJkxKxeSKlpt0QLXD9K/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/by9DDJ/hyPII2fPwh/kKAuLGJKmpbc0ycTQQ9Abk/img.jpg?width=1100&amp;amp;height=619&amp;amp;face=0_0_1100_619&quot; data-src=&quot;https://scrap.kakaocdn.net/dn/eynRv/hyPIJfMNpn/o2mNV9f8Tx5kIB7iTgKwOk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/AsW7s/hyPIN3AfGG/tLoxJkxKxeSKlpt0QLXD9K/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/by9DDJ/hyPII2fPwh/kKAuLGJKmpbc0ycTQQ9Abk/img.jpg?width=1100&amp;amp;height=619&amp;amp;face=0_0_1100_619&quot; /&gt; &lt;/a&gt;
&lt;div&gt;
&lt;div&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/GitHub-%F0%9F%8F%9B%EF%B8%8F-%EA%B9%83%ED%97%99-%ED%86%A0%ED%81%B0-%EB%B0%9B%EA%B8%B0&quot;&gt;[GitHub]  ️ 깃헙 토큰 발급 받기&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;i&gt;&lt;/i&gt; inpa.tistory.com&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;최근에 Git Hub에서 ID/PW기반의 Basic Authentication 인증을 금지하고, ID/Personal Access Token 방식의 Token Authentication 인증을 요구하고 있다. 앞으로는 소스코드를 push/clone하려고 하면, 아래와 같..&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;418&quot; data-origin-width=&quot;763&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSqzTe/btrLDPNj1Ul/MvAlCEEcLwbjASkN4ajpK0/img.png&quot; width=&quot;763&quot; height=&quot;418&quot; data-phocus-index=&quot;18&quot; data-src=&quot;https://blog.kakaocdn.net/dn/bSqzTe/btrLDPNj1Ul/MvAlCEEcLwbjASkN4ajpK0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSqzTe%2FbtrLDPNj1Ul%2FMvAlCEEcLwbjASkN4ajpK0%2Fimg.png&quot; data-origin-height=&quot;418&quot; data-origin-width=&quot;763&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;5.&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인텔리제이 동기화 성공이되면, 저장소에는&lt;span&gt;&amp;nbsp;IDE Setting값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;xml&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일로 올라가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;626&quot; data-origin-width=&quot;910&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OSJMz/btrLDH2XcSj/py01IxuVwLiGpl483TG8s0/img.png&quot; width=&quot;910&quot; height=&quot;626&quot; data-phocus-index=&quot;19&quot; data-src=&quot;https://blog.kakaocdn.net/dn/OSJMz/btrLDH2XcSj/py01IxuVwLiGpl483TG8s0/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOSJMz%2FbtrLDH2XcSj%2Fpy01IxuVwLiGpl483TG8s0%2Fimg.png&quot; data-origin-height=&quot;626&quot; data-origin-width=&quot;910&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;7.&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;다른 컴퓨터에서 인텔리제이 설정 불러오기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 컴퓨터에서 IntelliJ를 실행하고, 상단 메뉴 에서 [File] - [Manager IDE Settings] - [Settings Repository]를 클릭하고 위에서 생성한 URL정보를 불러온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;557&quot; data-origin-width=&quot;751&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUqLo/btrMgQ4vxd6/H3BAUFuStzlBbPe3t0WLP1/img.png&quot; width=&quot;751&quot; height=&quot;557&quot; data-phocus-index=&quot;20&quot; data-src=&quot;https://blog.kakaocdn.net/dn/oUqLo/btrMgQ4vxd6/H3BAUFuStzlBbPe3t0WLP1/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUqLo%2FbtrMgQ4vxd6%2FH3BAUFuStzlBbPe3t0WLP1%2Fimg.png&quot; data-origin-height=&quot;557&quot; data-origin-width=&quot;751&quot; /&gt;&lt;/figure&gt;
&lt;figure data-origin-height=&quot;236&quot; data-origin-width=&quot;505&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9YMyG/btrMd7Gqa9o/8zWKW5H7O7dEiXVzgGKrp1/img.png&quot; width=&quot;505&quot; height=&quot;236&quot; data-phocus-index=&quot;21&quot; data-src=&quot;https://blog.kakaocdn.net/dn/9YMyG/btrMd7Gqa9o/8zWKW5H7O7dEiXVzgGKrp1/img.png&quot; data-srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9YMyG%2FbtrMd7Gqa9o%2F8zWKW5H7O7dEiXVzgGKrp1%2Fimg.png&quot; data-origin-height=&quot;236&quot; data-origin-width=&quot;505&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://inpa.tistory.com/entry/IntelliJ-&quot;&gt;https://inpa.tistory.com/entry/IntelliJ-&lt;/a&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/IntelliJ-%F0%9F%92%BD-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%97%90%EB%94%94%ED%84%B0-%EC%84%A4%EC%A0%95-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%B0%A9%EB%B2%95&quot;&gt; -플러그인-에디터-설정-동기화-방법&lt;/a&gt; [Inpa Dev  &amp;zwj; :티스토리]&lt;/p&gt;</description>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/314</guid>
      <comments>https://mtoo.tistory.com/314#entry314comment</comments>
      <pubDate>Tue, 29 Apr 2025 20:37:41 +0900</pubDate>
    </item>
    <item>
      <title>[php] 라라벨 설치</title>
      <link>https://mtoo.tistory.com/313</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 10 설치&lt;/p&gt;
&lt;pre id=&quot;code_1745551675966&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer create-project laravel/laravel:^10.0 laravel10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라라벨 11 설치&lt;/p&gt;
&lt;pre id=&quot;code_1745557826551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;composer create-project laravel/laravel:^11.0 laravel11&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mtoo.tistory.com/202&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker&amp;nbsp;WSL&amp;nbsp;2&amp;nbsp;Ubuntu&amp;nbsp;&amp;nbsp;php&amp;nbsp;laravel&amp;nbsp;Install&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mtoo.tistory.com/320&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WSL(우분투)&amp;nbsp;환경에&amp;nbsp;Laravel(라라벨)&amp;nbsp;11&amp;nbsp;설치&lt;/a&gt;&lt;/p&gt;</description>
      <category>Program Language/PHP</category>
      <author>엠투</author>
      <guid isPermaLink="true">https://mtoo.tistory.com/313</guid>
      <comments>https://mtoo.tistory.com/313#entry313comment</comments>
      <pubDate>Fri, 25 Apr 2025 12:28:13 +0900</pubDate>
    </item>
  </channel>
</rss>