반응형

📰 기사 요약

이재명 정부는 ‘국민추천제’로 일주일간 장·차관 및 공공기관장 후보를 국민들로부터 추천받습니다 

  • 추천 기간: 2025년 6월 10일(화)부터 1주일간
  • 추천 대상: 장·차관 및 공공기관장 등 대통령 임명 주요 공직자
  • 신청 방법: 인사혁신처 국민추천제 홈페이지에서 제출하거나,
    이재명 대통령 공식 SNS, 이메일, 쪽지 또는 편지를 통해 추천 가능
  • 검증 절차: 제출된 정보는 인사 검증 및 공개 검증을 통해 선별
  • 목적: 국민 주권 정부 실현과 ‘진짜 일꾼’ 발굴을 위한 공정·투명한 인사 시스템 구축

📣 “국민이 직접 추천”…이재명 정부, 장·차관·공공기관장 1주일간 국민추천제 시행

이재명 정부는 2025년 6월 10일부터 일주일 동안, 국민들이 직접 장·차관 및 공공기관장 후보를 추천하는 국민추천제를 실시합니다.
이는 정부의 핵심 인사를 민주적·공정하게 선발하기 위한 혁신적인 인사 정책입니다.

⏰ 추천 기간

  • **2025년 6월 10일(화)**부터 **2025년 6월 16일(월)**까지, 총 1주일간 진행

🧭 추천 대상

  • 장·차관급 고위 공직자 전원
  • 대통령이 임명할 수 있는 공공기관장까지 포함

📝 추천 방법

  1. 인사혁신처 국민추천제 홈페이지를 통한 신청
  2. 이재명 대통령의 공식 SNS 또는 이메일을 통해 추천서 제출
  3. 또는 쪽지·편지를 통해 직접 추천 가능

🔍 검증과 임명 과정

  • 접수된 추천자는 인사 검증공개 검증 절차를 거침
  • 엄정한 심사를 통해 투명하고 공정한 방식으로 인재를 선발

💬 정부 설명 (강유정 대통령실 대변인)

“국민 여러분의 집단 지성을 활용해, 국민을 위해 진정성 있게 일할 진짜 인재를 넓게 발굴하겠다”…“국민주권 정부의 국정 철학을 실질적으로 뒷받침하는 인사 제도”라고 강조

 

 

새로운 국민 참여 중심의 정치와 인사를 경험할 기회입니다.
장·차관 클래스의 인사를 국민이 선정한다는 점에서 진정한 민주주의 공동체 실현에 한걸음 더 나아간 정책입니다.

지금 바로 참여해 보세요 → [국민추천제 홈페이지]
여러분이 추천한 ‘진짜 일꾼’이 정책을 실현하고, 대한민국을 변화시킬 지도 모릅니다.

반응형
반응형

📊 한눈에 보는 차이점

구분ResetRevert

히스토리 삭제/변경 보존
안전성 위험할 수 있음 안전함
협업 문제 발생 가능 협업 친화적
되돌리기 방식 시간을 되감기 새로운 커밋으로 취소

🔄 Reset: "시간을 되감는다"

작동 방식

  • 커밋 히스토리를 실제로 지우거나 변경
  • HEAD 포인터를 이전 커밋으로 이동
  • 마치 해당 커밋이 없었던 것처럼 만듦

Reset 옵션들

 
bash
# 1. --soft: 커밋만 취소, 변경사항은 staged 상태로 유지
git reset --soft HEAD~1

# 2. --mixed (기본값): 커밋 취소, 변경사항은 unstaged 상태로 유지
git reset HEAD~1
git reset --mixed HEAD~1

# 3. --hard: 커밋과 모든 변경사항 완전 삭제
git reset --hard HEAD~1

사용 예시

 
이전: A --- B --- C --- D (HEAD)
실행: git reset --hard B
결과: A --- B (HEAD)
      (C, D 커밋이 완전히 사라짐)

↩️ Revert: "실행 취소 커밋을 만든다"

작동 방식

  • 기존 히스토리는 그대로 보존
  • 특정 커밋의 변경사항을 반대로 하는 새로운 커밋 생성
  • 안전하게 변경사항만 되돌림

사용 예시

 
bash
# 특정 커밋을 revert
git revert <commit-hash>

# merge 커밋을 revert (-m 1은 main parent를 의미)
git revert -m 1 <merge-commit-hash>

# 여러 커밋을 한번에 revert
git revert <commit1>..<commit2>

사용 예시 (히스토리)

 
이전: A --- B --- C --- D (HEAD)
실행: git revert C
결과: A --- B --- C --- D --- C' (HEAD)
      (C'는 C의 변경사항을 되돌리는 새로운 커밋)

🎯 언제 어떤 것을 사용해야 할까?

Reset을 사용하는 경우

아직 push하지 않은 로컬 커밋을 되돌릴 때 ✅ 혼자 작업하는 브랜치에서 실수를 고칠 때 ✅ 임시 커밋들을 정리할 때

 
bash
# 예: 마지막 커밋의 메시지만 수정하고 싶을 때
git reset --soft HEAD~1
# 수정 후 다시 커밋
git commit -m "수정된 커밋 메시지"

Revert를 사용하는 경우

이미 push한 커밋을 되돌릴 때 ✅ 다른 사람과 공유하는 브랜치에서 작업할 때 ✅ 히스토리를 보존하면서 안전하게 되돌리고 싶을 때 ✅ 특정 기능만 제거하고 싶을 때

 
bash
# 예: 프로덕션에 배포된 버그가 있는 커밋을 안전하게 되돌리기
git revert abc1234
git push origin main

⚠️ 주의사항

Reset 주의사항

  • push한 커밋을 reset하면 다른 개발자들과 충돌 발생
  • --hard 옵션은 변경사항을 완전히 삭제 (복구 어려움)
  • 협업 시 git push --force 사용 시 매우 위험

Revert 주의사항

  • merge 커밋을 revert할 때는 -m 옵션 필요
  • 여러 번 revert하면 히스토리가 복잡해질 수 있음
  • revert한 커밋을 다시 merge하려면 revert를 다시 revert해야 함

🔧 실무 예시

시나리오 1: 로컬에서 실수한 커받

 
bash
# 마지막 커밋이 잘못됨 (아직 push 안함)
git reset --hard HEAD~1  # ✅ 괜찮음

시나리오 2: 이미 push한 커밋에 버그 발견

 
bash
# 이미 다른 사람들이 pull받은 상태
git revert abc1234  # ✅ 안전함
git push origin main

시나리오 3: merge를 되돌리고 싶음

 
bash
# merge 커밋을 되돌리기
git revert -m 1 merge-commit-hash  # ✅ 안전함

💡 기억하기 쉬운 요약

Reset: "없었던 일로 만들기" (위험하지만 깔끔) Revert: "실행 취소 기록 남기기" (안전하지만 히스토리 복잡)

황금 규칙: Push한 커밋은 Revert, 안 한 커밋은 Reset!

반응형
반응형

 

객체지향 프로그래밍(OOP)은 복잡한 소프트웨어를 더 쉽게 설계하고 관리할 수 있게 해주는 프로그래밍 패러다임입니다. 실제 세계의 개념을 모델링하여 코드를 구조화하는 방식으로, 다음과 같은 주요 개념을 포함합니다:

## 객체와 클래스

- **객체**: 실제 세계의 물건이나 개념을 표현한 것입니다. 예를 들어, '자동차'라는 객체가 있을 수 있습니다.
- **클래스**: 객체를 만들기 위한 '설계도'입니다. '자동차' 클래스는 모든 자동차 객체의 공통적인 특성과 기능을 정의합니다.

// 클래스
class Car {
    public $brand;
    public $color;

    public function __construct($brand, $color) {
        $this->brand = $brand;
        $this->color = $color;
    }

    public function getInfo() {
        return "This is a {$this->color} {$this->brand}.";
    }
}

// 인스턴스(객체) 생성
$myCar = new Car("Toyota", "red");
echo $myCar->getInfo(); // 출력: This is a red Toyota.



## 주요 특성

1. **캡슐화**
   - 데이터(속성)와 그 데이터를 처리하는 메서드를 하나의 단위로 묶는 것입니다.

class BankAccount {
    private $balance = 0;

    public function deposit($amount) {
        if ($amount > 0) {
            $this->balance += $amount;
        }
    }

    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance(); // 출력: 100



2. **상속**
   - 기존 클래스의 특성을 새로운 클래스가 물려받는 것입니다.
   - 예: 'ElectricCat' 클래스는 'Car' 클래스의 특성을 상속받아 기본 기능을 유지하면서 추가 기능을 구현합니다.

class ElectricCar extends Car {
    private $batteryLevel;

    public function __construct($brand, $color, $batteryLevel) {
        parent::__construct($brand, $color);
        $this->batteryLevel = $batteryLevel;
    }

    public function getBatteryInfo() {
        return "Battery level: {$this->batteryLevel}%";
    }
}

$myElectricCar = new ElectricCar("Tesla", "blue", 80);
echo $myElectricCar->getInfo(); // 출력: This is a blue Tesla.
echo $myElectricCar->getBatteryInfo(); // 출력: Battery level: 80%



3. **다형성**
   - 같은 이름의 메소드가 다른 클래스에서 다르게 동작할 수 있는 능력입니다.
   - 예: 'move' 메소드가 'Car'와 'Boat' 클래스에서 각각 다르게 구현될 수 있습니다.

interface Vehicle {
    public function move();
}

class Car implements Vehicle {
    public function move() {
        return "The car is driving on the road.";
    }
}

class Boat implements Vehicle {
    public function move() {
        return "The boat is sailing on the water.";
    }
}

function transport(Vehicle $vehicle) {
    echo $vehicle->move();
}

$car = new Car();
$boat = new Boat();

transport($car);  // 출력: The car is driving on the road.
transport($boat); // 출력: The boat is sailing on the water.



4. **추상화**
   - 복잡한 시스템에서 핵심적인 개념이나 기능을 간추려내는 것입니다.

abstract class Shape {
    abstract public function calculateArea();
}

class Circle extends Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function calculateArea() {
        return pi() * $this->radius * $this->radius;
    }
}

class Square extends Shape {
    private $side;

    public function __construct($side) {
        $this->side = $side;
    }

    public function calculateArea() {
        return $this->side * $this->side;
    }
}

$circle = new Circle(5);
$square = new Square(4);

echo $circle->calculateArea(); // 출력: 약 78.54
echo $square->calculateArea(); // 출력: 16



## OOP의 장점

- **코드 재사용**: 상속을 통해 기존 코드를 쉽게 재사용할 수 있습니다.
- **유지보수 용이성**: 객체 단위로 코드가 모듈화 되어 있어 수정이 쉽습니다.
- **확장성**: 새로운 클래스를 추가하거나 기존 클래스를 수정하여 기능을 쉽게 확장할 수 있습니다.

객체지향 프로그래밍은 이러한 개념들을 활용하여 복잡한 소프트웨어 시스템을 더 체계적이고 효율적으로 구현할 수 있게 해 줍니다. 실제 세계의 개념을 프로그래밍에 적용함으로써, 개발자들은 더 직관적이고 관리하기 쉬운 코드를 작성할 수 있습니다.

반응형
반응형

 

Laravel 애플리케이션의 생명주기를 여행에 비유해 볼까요? 이 여행은 사용자가 웹사이트에 접속하는 순간부터 시작됩니다.

 


1. 여행의 시작

    - 사용자가 웹사이트 주소를 입력하면, 그 요청이 'Public/index.php' 파일에 도착합니다. 이것은 여행의 출발점입니다.

2. 짐 꾸리기

    - 애플리케이션은 필요한 모든 것을 준비합니다. 이과정을 '부트스트래핑'이라고 합니다.

3. 여행 가이드 만나기

    - 요청은 HTTP 커널이라는 '여행 가이드'를 만납니다. 이 가이드는 요청이 어디로 가야 할지 안내해 줍니다.

4. 여행 준비 점검

    - 서비스 프로바이더들이 데이터베이스 연결, 보안 설정 등 여행에 필요한 모든 것을 점검합니다. 

5. 길 찾기

    - 라우터가 요청이 가야 할 정확한 목적지(컨트롤러나 특정 기능)를 찾아줍니다.

6. 검문소 통과

    - 요청은 미들웨어라는 여어 '검문소'를 통과합니다. 각 검문소는 요청이 적절한지 확인합니다.

7. 목적지 도착

    - 요청이 컨트롤러에 도착합니다. 컨트롤러는 요청을 처리하고 필요한 작업을 수행합니다.

8. 응답 준비

    - 컨트롤러가 작업을 마치면, 사용자에게 보낼 응답을 준비합니다.

9. 여행의 종료

    - 준비된 응답이 사용자의 브라우저로 전송되며, 여행이 끝납니다.


 

이렇게 Laravel은 사용자의 요청을 받아서 처리하고, 그 결과를 다시 사용자에게 보내는 전체 과정을 체계적으로 관리합니다.

이 구조 덕분에 개발자는 각 단계에서 필요한 기능을 쉽게 추가하거나 수정할 수 있습니다.

반응형

'Web Programming > Laravel' 카테고리의 다른 글

[LARAVEL] 라라벨 디렉터리 구조  (0) 2021.10.18
반응형

EXPLAIN 활용법

1. EXPLAIN 이란 mysql의 쿼리문이 DB에서 어떻게 처리가 되는지 실행계획을 알 수 있는 명령문이다.

2. EXPLAIN은 SELECT, DELETE, INSERT, REPLACE, UPDATE문과 함께 작동한다. 하지만 활용도면에서는 SELECT쿼리문에서 9할 이상 차지하는 것 같다.

-- 실행 방법
EXPLAIN SELECT * FROM TB_PRODUCT;

EXPLAIN
UPDATE TB_PRODUCT
SET
	PRODUCT_NAME = '상품명 업데이트'
WHERE
	PRODUCT_NO = 1;

3. EXPLAIN 칼럼

- id : 쿼리문 안에 있는 각 select문에 대한 순차 식별자로 id안의 숫자 차례대로 select문이 실행된다.

- select_type : select문의 유형이다.

  ㄴ SIMPLE : union 또는 sub query 등이 없는 기본 select 쿼리

  ㄴ PRIMARY : union 또는 sub query 등을 사용하는 경우 첫 번째 select 쿼리

  ㄴ UNION : union에서 두 번째 이상의 select 쿼리

  ㄴ DEPENDENT_UNION : UNION이나 UNION ALL로 결합된 단위 쿼리가 외부의 영향에 받는 것을 의미한다.

  ㄴ UNION_RESULT : union의 결과

  ㄴ SUBQUERY : sub query의 첫 번째 select 쿼리

  ㄴ DEPENDENT_SUBQUERY : 서브 쿼리가 바깥쪽(Outer) SELECT 쿼리에서 정의된 칼럼을 사용하는 경우를       DEPENDENT SUBQUERY라고 표현한다.

  ㄴ DERIVED : 서브 쿼리가 from 절에서 사용된 경우 DERIVED로 표시된다. DERIVED는 단위 SELECT 쿼리의 실행

    결과를 메모리나 디스크에 임시 테이블을 생성하는 것을 의미한다. DERIVED로 생성되는 임시 테이블을 파생

    테이블이라고도 한다. FROM 절에 사용된 서브 쿼리는 제대로 최적화되지 못할 때가 대부분이다. 파생 테이블에는

    인덱스가 전혀 없으므로 다른 테이블과 조인할 때 성능상 불리할 때가 많다. 가능하다면 DERIVED 형태의 실행

    계획을 조인으로 해결할 수 있도록 바꾸는 것이 좋다.

  ㄴ UNCACHEABLE SUBQUERY : 쿼리에서 from 절 이외의 부분에서 사용된 서브 쿼리는 mysql 옵티마이저가

    캐싱하여 재사용이 될 수 있도록 유도하는데 이러한 캐시 기능을 사용할 수 없는 경우이다. 이러한 경우에는 사용자

    변수를 제거하거나 다른 함수로 대체해서 사용하는 것을 검토하는 것이 좋다.

  ㄴ UNCACHEABLE UNION : UNION과 동일하지만 공급되는 모든 값에 대하여 UNION 쿼리를 재처리한다.

- table : 결과 열이 참조되는 테이블을 표시한다.

- partitions : 테이블의 파티션중 어떤 파티션을 사용했는지 등의 정보를 표시한다.

- type : 조인(join)의 타입. 

  ㄴ system : 하나의 행만 가지고 있다. const조인 유형의 특별한 경우이다.

  ㄴ const : 테이블은 적어도 하나의 매칭테이블을 가지고 있는데, 쿼리가 시작되는 시점에서 이 테이블을 읽게 된다. 

    여기에는 하나의 열만이 존재하기 때문에, 이 열에 있는 컬럼에서 얻는 값은 나머지 옵티마이저에 의해

    상수(constant)로 인식될 수 있다. const 테이블은 한번 밖에 읽혀지지 않기 때문에 매우 빠르다.

  ㄴ eq_ref : 이전 테이블로부터 각 열을 조합 (combination)하기 위해서 이 테이블의 열을 하나읽는다. 

    system  const 타입과는 달리, 이것이 가장 최선의 가능 조인 (join) 타입이다. 이것은 조인 (join)에 의해 인덱스의

    모든 부분이 사용될 때 쓰이게 되며, 이때 인덱스는 PRIMARY KEY 또는 UNIQUE 인덱스가 된다eq_ref 

    = 연산자를 사용해서 비교되는 인덱스된 컬럼용으로 사용될 수 있다. 비교 값은 이 테이블 전에 읽었던 테이블에서        컬럼을 사용한 수식 또는 상수 (constant)가 될 수 있다. 아래의 예제에서 보면, MySQL ref_table를 처리하기

    위해서 eq_ref 조인 (join)을 사용하고 있다.

  ㄴ ref : 이전 테이블에서 읽어온 각각의 열을 조합하기 위해 이 테이블에서 매칭되는 인덱스 값을 가진 모든 열을

    읽어온다. 만일 조인 (join)이 키의 좌측 끝(leftmost) 접두사 만을 사용하거나 또는 키 값이 PRIMARY KEY

    또는 UNIQUE 인덱스가 아니라면 (달리 말하면, 만일 조인 (join)이 키 값을 기반으로 한 단일 (single) 열을 선택하지

    않는다면), ref가 사용된다. 만일 사용된 키가 적은 수의 열에 대해서만 매치가 된다면, 그것은 좋은 조인 (join) 타입인

    것이다ref = 또는 <=> 연산자를 사용해서 비교되는 인덱스된 컬럼에 대해 사용될 수 있다.

  ㄴ ref_or_null : 이 조인 (join) 타입은 ref과 유사하지만, MySQL NULL 값을 가지고 있는 열에 대해서도 검색을

    한다는 점에서 차이가 있다. 이 조인 (join) 타입 최적화는 서브 쿼리(subqueries)를 해석할 때 자주 사용된다. 아래의

    예제에서 보면, MySQL ref_table처리 과정에서 ref_or_null 조인 (join)을 사용하고 있다.

  ㄴ index_merge : 이 조인 (join) 타입은 인덱스 병합 최적화가 사용되었음을 나타낸다. 이 경우에, 결과 열에

    있는 key 컬럼은 사용된 인덱스 리스트를 가지고 있고, key_len는 사용된 인덱스에 대해서 가장 긴 키 부분의

    리스트를 가지고 있다.

  ㄴ unique_subquery : 이 타입은 아래 형태의 IN 서브 쿼리 (subqueries)에 대해서 ref를 대체한다.

  ㄴ index_subquery : 이것은 unique_subquery와 유사한 조인 (join) 타입이다. 이것은 IN 서브 쿼리(subqueries)

    대체하지만, 아래 형태의 서브 쿼리 (subquery)에 있는 논-유니크(non-unique)인덱스에 대해서도 동작을 한다.

  ㄴ range : 주어진 범위에 들어 있는 열만을 추출하며, 열 선택은 인덱스를 사용한다. 결과 열에 있는 key 컬럼은

    어떤 인덱스가 사용되었는지를 가리킨다. key_len은 사용된 키에서 가장 긴 부분을 가진다. ref 컬럼은 이 타입에

    대해서는 NULL 값이 된다. range는 키 컬럼이 =<>, >>=<<=IS NULL<=>BETWEEN또는 IN 연산자를

    사용하는 상수 (constant)와 비교할 때 사용될 수 있다

SELECT * FROM tbl_name WHERE key_column = 10;
SELECT * FROM tbl_name WHERE key_column BETWEEN 10 AMD 20;
SELECT * FROM tbl_name WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name WHERE key_part1= 10 AND key_part2 IN (10,20,30);

  ㄴ index : 이 조인 (join) 타입은 ALL과 동일하지만, 인덱스 트리 (index tree)만을 스캔한다는 점에서 다르다. 

    일반적으로, 보통의 인덱스 파일이 데이터 파일보다 작기 때문에, 이것은  ALL 보다는 빠르게 동작한다.

    MySQL은 쿼리가 단일 인덱스의 일부분인 컬럼만을 사용할 때 이 조인 (join) 타입을 사용한다.

  ㄴ ALL : 이전 테이블에서 읽어온 각각의 열을 조합하기 위해 전체 테이블 스캔을 실행한다. 테이블이 const

  표시되지 않은 첫 번째 테이블이고, 다른 모든 경우에 있어서 매우 좋지 않은 경우라면, 이것은 그리 좋은 경우가

  아니다. 일반적인 경우에는, 이전 테이블에서 가져온 상수(constant) 값 또는 컬럼 값을 사용해서 테이블 열을

  추출하는 인덱스를 추가하면 ALL을 피할 수가 있다.

- possible_keys : 테이블에서 열을 찾기 위해 mysql이 선택한 인덱스를 가리킨다. 이 칼럼은 EXPLAIN의 결과에서

나타나는 테이블 순서와는 완전히 별개의 순서가 된다. 이는 possible_keys의 일부 키가 테이블 순서를 만드는 과정에서 사용되지 않을 수도 있음을 의미한다.

- key : mysql이 실제로 사용하기로한 index를 나타낸다. possible_keys 인덱스 중 하나를 사용하여 행을 찾으려면 해당 인덱스가 key값으로 나열된다.

- key_len : mysql이 사용하기로 결정한 key의 길이를 나타낸다. key 값이 NULL이면 key_len도 NULL값이 된다.

- ref : 테이블에서 열을 선택하기 위해 key 안에 명명되어 있는 인덱스를 어떤 컬럼 또는 상수와 비교하는지를 보여준다.

- rows : mysql이 쿼리를 실행하기 위해 조사해야 하는 열의 숫자를 가리킨다.

- Extra : mysql이 쿼리를 어떻게 해석하는지에 관한 추가적인 정보를 제공한다.

반응형
반응형

개발자 로드맵

BACKEND DEVELOPER
1. 인터넷
    1) 인터넷 작동원리
    2) http 란?
    3) 브라우져 동작 원리
    4) DNS와 작동원리
    5) 도메인 네임이란?
    6) 호스팅이란?
2. 기본 프론트엔드 지식
    1) HTML
    2) CSS
    3) JAVASCRIPT
3. OS 및 일반적인 지식
    1) 터미널 사용방법
    2) OS의 일반적인 작동 방식
    3) 프로세스 관리
    4) 스레드와 동시성
    5) 기본적인 터미널 명령어(grep, awk, sed, lsof, curl, wget, tail, head, less, find, ssh, kill)
    6) 메모리관리
    7) 프로세스간 통신(IPC)
    8) 입출력(I/O) 관리
    9) POSIX 기초(stdin, stdout, stderr, pipes)
    10) 기본적인 네트워크 개념
4. 백엔드 언어
    1) PHP

    2) JAVA

    3) PYTHON
5. 버전관리
    1) GIT 기본 사용법
6. 저장소 호스팅서비스
    1) GITHUB
7. 관계형 데이터베이스
    1) MYSQL
    2) POSTGRESQL
8. 데이터베이스 상세정보
    1) ORM
    2) ACID
    3) 트랜잭션
    4) N+1 문제
    5) 데이터베이스 정규화
    6) 인덱스와 작동방식
9. NOSQL 데이터베이스
    1) MONGODB
10. API에 대해 배우기
    1) 인증
        - OAuth
        - 기본적인 인증
        - 토큰인증
        - JWT
    2) REST
    3) JSON APIs
11. 캐싱
    1) CDN
    2) 서버 사이드
        - Redis
        - Memcached
    3) 클라이언트 사이드
12. 웹 보안지식
    1) 해시 알고리즘
        - MD5와 사용하지 않는 이유
        - SHA Family
        - scrypt
        - bcrypt
    2) https
    3) 컨텐츠 보안정책
    4) CORS
    5) SSL/TLS
    6) OWASP 보안 정책
13. 테스팅
    1) 통합테스트
    2) 단위테스트
    3) 기능테스트
14. CI/CD
15. 개발과 설계 원칙
    1) SOLID
    2) KISS
    3) YAGNI
    4) DRY
16. 아키텍쳐 패턴
    1) 모놀로틱 앱
    2) 마이크로서비스
    3) SOA
    4) CQRS와 이벤트 소싱
    5) Serverless
17. 검색엔진
    1) Elasticsearch
18. 메세지 브로커
    1) RabbitMQ
19. 컨테이너화 VS 가상화
    1) Docker
20. GraphQL
    1) Apollo
21. 웹서버
    1) Nginx
    2) Apach
22. 확장성

반응형
반응형

XSS

1. xss

- xss는 Cross Site Script의 약자로 cross인데 왜 x인지 궁금한 사람들이 많을 텐데 css는 이미 Cascading Style Sheets의 약어로 사용되고 있어 XSS라 한다.

- xss는 사용자가 요청한 페이지에 강제로 악성 스크립트를 삽입하여 브라우저에서 악의적인 동작이 실행되도록 하는 공격이다. 또한 대부분의 웹 해킹 공격과는 다르게 클라이언트(사용자)를 대상으로 하는 공격이다.

- xss의 기본 공격 방식은 사용자의 브라우저가 악성 스크립트를 실행하게 하는 것이나 그 방식에 따라 크게 Reflected-XSS, Stored-XSS, DOM-based-XSS 이렇게 세 종류로 나뉜다.

 

2. Reflected-XSS

- Reflected XSS는 직역하면 반사형 XSS로 사용자의 요청에 포함된 스크립트가 서버로부터 그대로 반사(Reflected)되어 응답 메시지에 포함돼 브라우저에서 스크립트를 실행되는 공격이다.

- 반사된 xss는 피싱 공격의 일부로 자주 사용되며 악용하기도 차단하기도 가장 쉬운 공격이다.

- Reflected XSS의 간단한 예시로 http://www.url.com/reflectedxss.php?name=<script>alert('공격!!!');</script>로 서버에 스크립트를 포함한 요청을 보낼 경우 스크립트가 보낸 그대로 브라우저로 응답되어 스크립트가 실행된다.

Reflected-XSS

 

3. Stored XSS

- Stored XSS는 직역하면 저장된 XSS로 이름에서도 예상할 수 있듯이 악성 스크립트가 서버측에 저장되어 사용자들의 요청이 있을 때마다 저장된 스크립트가 사용자에게 응답되어 스크립트를 실행시키는 공격이다.

- 예를 들면 웹사이트 상의 글을 남길수 있는 페이지에서 스크립트를 포함한 글을 작성하여 저장하고 해당 게시글을 읽는 모든 사람은 저장된 스크립트가 실행되어진다. 따라서 해당 취약점은 경우에따라 불특정 다수에게 영향을 끼칠 수 있기 때문에 주의해야한다.

Stored XSS

 

4. DOM-based XSS

- DOM-based XSS는 풀어서 말하면 문서 객체 모델 기반 xss로 영어로는 Document Object Model based XSS 이다.

- DOM-based XSS는 클라이언트(사용자)의 브라우저에서 DOM 환경을 수정하여 코드가 예상치 못한 방식으로 공격 구문이 실행되는 XSS(Cross Site Scripting) 공격이다.

- Stored XSS, Reflected XSS 취약점인 경우 서버 측 결함으로 인해 응답 페이지에 악성 스크립트 구문이 포함되어 브라우저로 전달되는 것이지만, DOM-Based XSS 취약점인 경우 서버와 관계없이 브라우저에서 발생한다.

- 간단한 예로 http://www.url.com/domxss.php#default=<script>alert(document.cookie)</script>

DOM-based XSS

 

5. xss의 보안방안

- xss공격은 굉장히 오래된 공격 기법이면서 취약성 테스트가 비교적 쉬운편이기 때문에 공격시도가 매우 높다. 개발되는 애플리케이션이 점점 다양해지고 방대해지면서 간과하고 넘어가는 경우가 많아 아직도 빈번히 발생되는 웹 취약점 상위권에 속해있다. 그러니 경각심을 가지고 사용자의 입력에 대해서 항상 의심하고 만에 하나 일어날수 있는 일에 검증하는 작업이 필요하고 HTML태그 또는 자바스크립트에서 사용하는 특수문자들에 대해 필터링 또는 인코딩을 하여 xss공격에 대응해야 한다.

 

 

# 이미지 출처 : https://www.ahnlab.com/

반응형
반응형

css background-image 속성

1. 정의 및 사용

- background-image속성은 요소에 대해 하나 이상의 배경 이미지를 설정한다. 기본적으로 배경 이미지는 요소의 왼쪽 상단 모서리에 배치되며 세로 및 가로로 반복된다.

- 기본값 : 없음

- 상속 : No

- 애니메이션 가능 : No

- 버전 : CSS1 + CSS3의 새로운 값

 

2. css 구문과 속성

- background-image : url | none | initial | inherit;

- url('URL') : 이미지의 URL. 두개 이상의 이미지를 지정시 URL을 쉼표로 구분한다.

- none : 배경이미지가 표시되지 않는다(기본값).

- conic-gradient() : 원뿔형 그라디언트는 중심점을 중심으로 회전된 색상 전환이 있는 그라디언트이다. 최소한 두 개의 색상을 정의해야 한다.

- linear-gradient() : 선형 그래디언트를 배경 이미지로 설정한다. 최소한 두 개의 색상을 정의해야 하며 그라데이션 효과와 함께 시작점과 방향(또는 각도)을 설정할 수도 있다.

- radial-gradient() : 방사형 그래디언트를 배경 이미지로 설정한다. 최소한 두 개의 색상을 정의해야 한다.

- repeating-conic-gradient() : 원뿔 그래디언트를 반복하는 데 사용한다. 

- repeating-linear-gradient() : 선형 그래디언트를 반복하는 데 사용한다.

- repeating-radial-gradient() : 방사형 그래디언트를 반복하는 데 사용한다.

- initial : 기본 값으로 CSS 속성을 설정하는 데 사용된다.

- inherit : 부모 요소의 값을 상속받는다.

 

3. 예제

- conic-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: conic-gradient(red, yellow, green);
}
</style>

- linear-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: linear-gradient(red, yellow, green);
}
</style>

- radial-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: radial-gradient(red, yellow, green);
}
</style>

- repeating-conic-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: repeating-conic-gradient(red 10%, yellow 20%);
}
</style>

- repeating-linear-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: repeating-linear-gradient(red 10%, yellow 20%);
}
</style>

- repeating-radial-gradient

<style>
#grad1 {
  height: 200px;
  width: 200px;
  background-image: repeating-radial-gradient(red 10%, yellow 20%);
}
</style>

- inherit

<!DOCTYPE html>
<html>
<head>
<style>
span {
  color: blue;
  border: 1px solid black;
}

.extra span {
  color: inherit;
}
</style>
</head>
<body>

<div>
  Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>

<div class="extra" style="color:green">
  Here is <span>a span element</span> which is green, because it inherits from its parent.
</div>

<div style="color:red">
  Here is <span>a span element</span> which is blue, as span elements are set to be.
</div>

</body>
</html>

반응형

'Web Programming > ----- CSS -----' 카테고리의 다른 글

[CSS] css 스타일 적용  (0) 2021.11.18
[CSS] css의 기본 문법  (0) 2021.11.10
[CSS] css 란 무엇인가?  (0) 2021.10.22
반응형

코드이그나이터 프레임웍 장단점

코드이그나이터 동작구조

1. 코드이그나이터 (codeigniter) 란

- php 기반의 오픈소스로 무료로 사용 가능한 framework이다. 가장 많이 사용하는 php framework로는 라라벨이지만 코드이그나이터 또한 다섯 손가락 안에 들 정도로 많이 사용하는 framework이다.

- 기본적으로 MVC 디자인 패턴을 기반으로 하고 있고 framework 중 설치도 간단하고 사용하기에도 쉽기에 많이 사용한다.

 

2. 장점

- 설치, 개발이 쉬운 편에 속한다. 웹 개발이 익숙하지 않은 사람도 쉽게 접근할 수 있는 장점이 있다.

- 가벼운 프레임워크로 다른 프레임워크와 비교해 봤을 때 속도가 빠른 장점이 있다.

- url과 파일명이 직관적으로 연결되어 있어 파일 찾기에 용의 하다.

- 다양한 라이브러리를 통합할 수 있다.

 

3. 단점

- 규모가 큰 웹사이트에 적합하지 않다.

- 다양한 라이브러리를 통합할수 있지만 제한적이다.(공식적으로 검증된 플러그인을 찾기가 어렵기 때문)

반응형
반응형

CSS 스타일 적용

1. Inline Style Sheet 인라인 스타일

- 스타일을 주고자 하는 view파일 내에 style속성을 넣는 방식

- 인라인 스타일의 css 적용은 내가 원하는 선택자에 빠르게 적용할 수 있다는 장점이 있지만 많은 부분에 css를 적용하는 데에는 한계가 있으며 재사용도 불가능하다는 단점이 있다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Inline Style Sheet 적용 예제</title>
  </head>
  <body>
      <p style="color:blue">글자색 변경하기</p>
  </body>
</html>

 

2. Internal Style Sheet 내부 스타일

- 스타일을 주고자 하는 view파일 내에 스타일을 정의하는 방식

- view파일 내에 스타일을 정의하기 때문에 여러 개의 파일을 만들 필요도 업로드할 필요도 없는 장점이 있지만 같은 파일 내에 정의하기 때문에 파일의 사이즈와 로딩 시간을 증가시키는 있는 단점이 있다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Internal Style Sheet 적용 예제</title>
    <style type="text/css">
        p{color:red}
    </style>
  </head>
  <body>
      <p>글자색 변경하기</p>
  </body>
</html>

 

3. External Style Sheet 외부 스타일

- 스타일이 정의된 파일을 별도로 생성하여 해당 파일을 불러와 스타일을 적용하는 방식

- 일반적으로 많이 쓰는 방식이며 css코드가 별도의 문서로 있어 view파일 구조가 깔끔해지고 유지보수 시 또는 협업을 할 때도 css파일만 수정하면 되기 때문에 효율을 극대화시키는 장점이 있고 크로스브라우징에 따라 권장하는 방식으로 전체 페이지를 잘 구조화하여야 하고 여러 개의 파일을 사용해야 하므로 파일 관리가 잘 이루어져야 하여 복잡할 수 있는 단점이 있다.

/* externalStyle.css 파일 생성 */
p{color:yello}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>External Style Sheet 적용 예제</title>
    <link rel="stylesheet" type="text/css" href="externalStyle.css" />
  </head>
  <body>
      <p>글자색 변경하기</p>
  </body>
</html>
반응형

'Web Programming > ----- CSS -----' 카테고리의 다른 글

[CSS] css background-image 속성  (0) 2021.11.25
[CSS] css의 기본 문법  (0) 2021.11.10
[CSS] css 란 무엇인가?  (0) 2021.10.22

+ Recent posts