모던 JS 문법

  • 모던 JS 문법은 ES6(ES2015) 이후 도입된 기능들로, 개발자 경험을 개선하고 코드를 간결하게 만듭니다.
  • Arrow Function, Spread 구문, Optional Chaining 외에도 Destructuring, Template Literals, Default Parameters 자주 사용되는 문법을 추가로 다루어보겠습니다.

Arrow Function (화살표 함수)
  - Arrow Function은 함수를 간결하게 정의하는 방법으로, function 키워드 대신 =>를 사용합니다. this 바인딩이 렉시컬(정적) 스코프를 따르는 점이 특징입니다.

 

기본사용

// 일반 함수
function add(a, b) {
    return a + b;
}

// Arrow Function
const addArrow = (a, b) => a + b; // 한 줄일 경우 중괄호와 return 생략 가능

console.log(add(3, 5));      // 8
console.log(addArrow(3, 5)); // 8

 

매개변수가 하나일 경우

 - 괄호 생략 가능

const square = x => x * x;
console.log(square(4)); // 16

 

객체 반환

 -객체를 반환할 때는 소괄호로 감싸야 함

const getPerson = name => ({ name: name, age: 30 });
console.log(getPerson("홍길동")); // { name: "홍길동", age: 30 }

 

this 바인딩 차이

 - Arrow Functiuon은 this를 정의된 위치(렉시컬 스코프)에서 가져옵니다.

const obj = {
    name: "김철수",
    sayHello: function() {
        setTimeout(function() {
            console.log(this.name); // 일반 함수: this는 setTimeout의 this (undefined)
        }, 1000);

        setTimeout(() => {
            console.log(this.name); // Arrow Function: this는 obj (김철수)
        }, 1000);
    }
};
obj.sayHello();
// 출력:
// undefined
// 김철수

 

활용 예시

 - 배열 메소드와 함께

const numbers = [1, 2, 3, 4];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]

 

 

Spread 구문(전개 연산자, ...)

 - Spread 구문은 배열이나 객체의 요소를 확장하거나 복사할 때 사용됩니다.

 

배열에서 사용

// 배열 복사
const arr1 = [1, 2, 3];
const arr2 = [...arr1]; // 얕은 복사
console.log(arr2); // [1, 2, 3]

// 배열 병합
const arr3 = [...arr1, 4, 5];
console.log(arr3); // [1, 2, 3, 4, 5]

// 배열 요소 전달
const sum = (a, b, c) => a + b + c;
const numbers = [1, 2, 3];
console.log(sum(...numbers)); // 6

 

객체에서 사용

// 객체 복사
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1 }; // 얕은 복사
console.log(obj2); // { a: 1, b: 2 }

// 객체 병합
const obj3 = { ...obj1, c: 3 };
console.log(obj3); // { a: 1, b: 2, c: 3 }

// 기존 속성 덮어쓰기
const obj4 = { ...obj1, a: 10 };
console.log(obj4); // { a: 10, b: 2 }

 

활용 예시

 - 함수 인자

const user = { name: "홍길동", age: 25 };
const updatedUser = { ...user, age: 26, city: "서울" };
console.log(updatedUser); // { name: "홍길동", age: 26, city: "서울" }

 

 

Optional Chaining(?.)

 - Optional Chaining은 객체 속성에 안전하게 접근할 때 사용됩니다. 속성이 존재하지 않을 경우 undefined를 반환하며, 오류를 방지합니다.

 

기본 사용

const user = {
    name: "김철수",
    address: { city: "부산" }
};

console.log(user.address?.city);    // "부산"
console.log(user.phone?.number);    // undefined (오류 없이 접근)

 

중첩된 객체

const data = {
    user: {
        profile: { age: 30 }
    }
};

console.log(data.user?.profile?.age);      // 30
console.log(data.user?.settings?.theme);   // undefined

 

함수 호출에서 사용

const obj = {
    sayHello: () => "안녕!"
};

console.log(obj.sayHello?.());     // "안녕!"
console.log(obj.sayGoodbye?.());   // undefined

 

활용 예시

 - API 데이터 처리

const response = {
    user: { name: "홍길동" }
};

const userName = response.user?.name ?? "익명"; // Optional Chaining + Nullish Coalescing
console.log(userName); // "홍길동"

 

 

Destructuring(구조 분해 할당)

 - 객체나 배열에서 값을 추출해 변수로 바로 할당합니다.

 

객체 구조 분해

const person = { name: "홍길동", age: 22, city: "대구" };

// 기존 방식
// const name = person.name;
// const age = person.age;

// 구조 분해
const { name, age } = person;
console.log(name, age); // "홍길동" 22

// 별칭 사용
const { name: userName, city: location } = person;
console.log(userName, location); // "홍길동" "대구"

 

배열 구조 분해

const fruits = ["사과", "바나나", "포도"];

// 기존 방식
// const first = fruits[0];
// const second = fruits[1];

// 구조 분해
const [first, second] = fruits;
console.log(first, second); // "사과" "바나나"

// 일부 요소 건너뛰기
const [, , third] = fruits;
console.log(third); // "포도"

 

활용 예시

 - 함수 매개변수

const printUser = ({ name, age }) => {
    console.log(`${name}${age}살입니다.`);
};

const user = { name: "김철수", age: 28 };
printUser(user); // "김철수은 28살입니다."

 

 

Template Literals(템플릿 리터럴)

- 백틱(`)을 사용해 문자열을 더 간결하게 작성합니다. 변수나 표현식을 ${}로 삽입 가능합니다.

const name = "홍길동";
const age = 25;

// 기존 방식
const greeting = "안녕, " + name + "! 나이는 " + age + "살이야.";

// 템플릿 리터럴
const greetingModern = `안녕, ${name}! 나이는 ${age}살이야.`;
console.log(greetingModern); // "안녕, 홍길동! 나이는 25살이야."

// 표현식 사용
console.log(`2 + 3 = ${2 + 3}`); // "2 + 3 = 5"

 

활용 예시

 - HTML 생성

const user = { name: "이영희", age: 22 };
const html = `
    <div>
        <h1>${user.name}</h1>
        <p>나이: ${user.age}</p>
    </div>
`;
console.log(html);

 

 

Default Parameters(기본 매개변수)

 - 함수 매개변수에 기본값을 설정합니다.

function greet(name = "익명", greeting = "안녕") {
    return `${greeting}, ${name}!`;
}

console.log(greet());              // "안녕, 익명!"
console.log(greet("홍길동"));      // "안녕, 홍길동!"
console.log(greet("김철수", "hi")); // "hi, 김철수!"

 


 

비동기 관련 문법

  • 자바스크립트는 비동기 작업(예: 네트워크 요청, 파일 읽기, 타이머)을 처리하기 위해 Callback, Promise, async/await를 사용합니다. 
  • Callback은 오래된 방식으로, 현재는 Promise와 async/await가 주로 사용됩니다.

Callback (콜백 함수)

 - 비동기 작업이 완료된 후 실행할 함수를 전달하는 방식입니다. 하지만 "콜백 지옥(Callback Hell)" 문제가 발생할 수 있습니다.

 

예시

 - 콜백 지옥

setTimeout(() => {
    console.log("1단계 완료");
    setTimeout(() => {
        console.log("2단계 완료");
        setTimeout(() => {
            console.log("3단계 완료");
        }, 1000);
    }, 1000);
}, 1000);
// 출력:
// 1초 후: "1단계 완료"
// 2초 후: "2단계 완료"
// 3초 후: "3단계 완료"

 

Promise
 - Promise는 비동기 작업의 성공(resolve) 또는 실패(reject)를 처리하는 객체입니다. 콜백 지옥을 해결하는 데 유용합니다.

 

기본 사용

const myPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
        const success = true; // 가정: 작업 성공
        if (success) {
            resolve("작업 성공!");
        } else {
            reject("작업 실패!");
        }
    }, 2000);
});

myPromise
    .then(result => console.log(result)) // 성공 시 실행
    .catch(error => console.error(error)); // 실패 시 실행
// 2초 후: "작업 성공!"

 

Promise 체이닝

const step1 = () => new Promise(resolve => {
    setTimeout(() => resolve("1단계 완료"), 1000);
});

const step2 = () => new Promise(resolve => {
    setTimeout(() => resolve("2단계 완료"), 1000);
});

const step3 = () => new Promise(resolve => {
    setTimeout(() => resolve("3단계 완료"), 1000);
});

step1()
    .then(result => {
        console.log(result);
        return step2();
    })
    .then(result => {
        console.log(result);
        return step3();
    })
    .then(result => console.log(result))
    .catch(error => console.error(error));
// 출력:
// 1초 후: "1단계 완료"
// 2초 후: "2단계 완료"
// 3초 후: "3단계 완료"

 

Promise.all

 - 여러 Promise를 병렬로 실행합니다

Promise.all([step1(), step2(), step3()])
    .then(results => console.log(results)) // 모든 Promise가 완료된 후 실행
    .catch(error => console.error(error));
// 출력: ["1단계 완료", "2단계 완료", "3단계 완료"]

 

async/await
 - async/await는 Promise를 더 간결하고 동기적으로 보이게 작성하는 문법입니다. async 함수는 항상 Promise를 반환합니다.

 

기본 사용

async function fetchData() {
    try {
        const result = await new Promise(resolve => {
            setTimeout(() => resolve("데이터 가져오기 성공!"), 2000);
        });
        console.log(result);
    } catch (error) {
        console.error("에러:", error);
    }
}

fetchData(); // 2초 후: "데이터 가져오기 성공!"

 

Promise 체이닝 대체

async function runSteps() {
    try {
        const result1 = await step1();
        console.log(result1);
        const result2 = await step2();
        console.log(result2);
        const result3 = await step3();
        console.log(result3);
    } catch (error) {
        console.error(error);
    }
}

runSteps();
// 출력:
// 1초 후: "1단계 완료"
// 2초 후: "2단계 완료"
// 3초 후: "3단계 완료"

 

병렬 실행 (Promise.all과 함께)

async function runStepsParallel() {
    try {
        const results = await Promise.all([step1(), step2(), step3()]);
        console.log(results);
    } catch (error) {
        console.error(error);
    }
}

runStepsParallel();
// 출력: ["1단계 완료", "2단계 완료", "3단계 완료"]

 

요약

  • 모던 JS 문법
     1. Arrow Function: 간결한 함수 정의, this 바인딩이 렉시컬 스코프
     2. Spread 구문: 배열/객체 복사 및 병합
     3. Optional Chaining: 안전한 속성 접근
     4. Destructuring: 객체/배열에서 값 추출
     5. Template Literals: 문자열 내 변수 삽입
     6. Default Parameters: 함수 매개변수 기본값 설정
  • 비동기 관련 문법
     1. Callback: 비동기 작업의 기본, 콜백 지옥 문제
     2. Promise: 성공/실패 처리, 체이닝 가능
     3. async/await: Promise를 동기적으로 보이게 작성, 에러 처리를 try/catch로 관리
     4. Promise.all: 여러 비동기 작업 병렬 실행

 


코드 이해해보기

  • 첫번째 코드
// 변수 선언: let을 사용하여 재할당 가능한 문자열 변수 message를 선언하고 "Hello, World!"로 초기화
let message = "Hello, World!";

// 상수 선언: const를 사용하여 재할당 불가능한 상수 pi를 선언하고 3.14로 초기화
const pi = 3.14;

// 변수 선언: let을 사용하여 재할당 가능한 불리언 변수 isActive를 선언하고 true로 초기화
let isActive = true;

// 객체 선언: let을 사용하여 재할당 가능한 객체 변수 user를 선언
// 객체는 name과 age 속성을 가짐
let user = {
    name: "Hong Gil-dong", // 속성: name은 "Hong Gil-dong" 문자열
    age: 25                // 속성: age는 25 숫자
};

// 배열 선언: let을 사용하여 재할당 가능한 배열 변수 colors를 선언
// 배열은 "red", "green", "blue" 문자열 요소를 포함
let colors = ["red", "green", "blue"];

// 함수 정의: greet라는 이름의 함수를 정의, name 매개변수를 받음
function greet(name) {
    // 콘솔에 "Hello, "와 name, "!"를 연결한 문자열 출력
    console.log("Hello, " + name + "!");
}

// 함수 호출: greet 함수를 호출하며 "Anna"를 인자로 전달
// 콘솔에 "Hello, Anna!"가 출력됨
greet("Anna");

 

  • 두번째 코드
// 객체 선언: let을 사용하여 재할당 가능한 객체 변수 student를 선언
let student = {
    name: "Kim Yoon-sung", // 속성: name은 "Kim Yoon-sung" 문자열
    major: "Computer Science", // 속성: major는 "Computer Science" 문자열
    // 메소드 정의: getIntroduction이라는 함수를 속성으로 정의
    getIntroduction: function() {
        // 콘솔에 "My name is ", this.name, " and I study ", this.major, "."를 연결한 문자열 출력
        // this는 student 객체를 참조하므로 this.name은 "Kim Yoon-sung", this.major는 "Computer Science"
        console.log("My name is " + this.name + " and I study " + this.major + ".");
    }
};

// 메소드 호출: student 객체의 getIntroduction 메소드를 호출
// 콘솔에 "My name is Kim Yoon-sung and I study Computer Science."가 출력됨
student.getIntroduction();

// 배열 선언: let을 사용하여 재할당 가능한 배열 변수 numbers를 선언
// 배열은 숫자 1, 2, 3, 4, 5를 요소로 포함
let numbers = [1, 2, 3, 4, 5];

// 배열 메소드 사용: push 메소드를 호출하여 배열 끝에 6을 추가
numbers.push(6);

// 콘솔 출력: numbers 배열을 출력
// push로 6이 추가되었으므로 [1, 2, 3, 4, 5, 6]이 출력됨
console.log(numbers);

 

  • 세번째 코드
// setTimeout: 지정된 시간(밀리초) 후에 함수를 한 번 실행하는 내장 함수
// 3000ms(3초) 후에 익명 함수를 실행
setTimeout(function() {
    // 3초 후에 콘솔에 메시지 출력
    console.log("3초가 지났어요!");
}, 3000);

// 변수 선언: 카운트를 저장할 변수 count를 0으로 초기화
let count = 0;

// setInterval: 지정된 시간 간격(밀리초)마다 함수를 반복 실행하는 내장 함수
// 1000ms(1초)마다 익명 함수를 실행, intervalId에 interval의 ID를 저장
let intervalId = setInterval(function() {
    // count를 1씩 증가
    count++;
    // 현재 count 값을 포함한 메시지 출력
    console.log(count + "초마다 메시지가 출력됩니다.");
    // count가 5 이상이면 반복 중지
    if (count >= 5) {
        // clearInterval: intervalId를 사용해 setInterval 반복을 중지
        clearInterval(intervalId);
    }
}, 1000);

// 배열 선언: fruits 배열에 문자열 요소 "apple", "banana", "cherry"를 포함
let fruits = ["apple", "banana", "cherry"];

// forEach: 배열의 각 요소에 대해 주어진 함수를 실행하는 배열 메소드
// 각 요소(fruit)를 콘솔에 출력
fruits.forEach(function(fruit) {
    console.log(fruit);
    // 출력:
    // apple
    // banana
    // cherry
});

// 배열 선언: numbers 배열에 숫자 요소 1, 2, 3, 4, 5를 포함
let numbers = [1, 2, 3, 4, 5];

// map: 배열의 각 요소에 대해 주어진 함수를 적용한 결과를 새로운 배열로 반환
// 각 요소(number)를 2배로 만들어 새로운 배열 doubledNumbers에 저장
let doubledNumbers = numbers.map(function(number) {
    return number * 2; // 각 숫자를 2배로 변환
});
// doubledNumbers 배열 출력: [2, 4, 6, 8, 10]
console.log(doubledNumbers);

// filter: 배열의 각 요소에 대해 주어진 조건을 만족하는 요소만 새로운 배열로 반환
// 짝수인 요소만 필터링하여 새로운 배열 evenNumbers에 저장
let evenNumbers = numbers.filter(function(number) {
    return number % 2 === 0; // number가 짝수일 경우 true 반환
});
// evenNumbers 배열 출력: [2, 4]
console.log(evenNumbers);

 


다음과 같은 내용에 도전해봅시다.

var, let과 const의 차이점 이해하기

  var let const
스코프 함수 스코프 블록 스코프 블록 스코프
재선언 가능 불가 불가
재할당 가능 가능 불가
호이스팅 undefined TDZ TDZ
권장 여부 비권장 권장 권장(상수용

 

 

Arrow Function 이해하기
- Arrow Function(화살표 함수)은 ES6에서 도입된 간결한 함수 표현식입니다. function 키워드 대신 =>를 사용하며, this 바인딩 방식이 다릅니다.

장점 주의점
간결한 문법 this가 고정되므로 객체 메소드나 이벤트 핸들러에서 부적합할 수 있음
this가 렉시컬 스코프로 고정되어 예측 가능 arguments 객체 사용 불가
배열 메소드(mpa, forEach 등)와 함께 사용 시 유용  

 

-  예시

const obj = {
    name: "홍길동",
    sayHello: function() {
        setTimeout(function() {
            console.log(this.name); // 일반 함수: this는 setTimeout의 this (undefined)
        }, 1000);

        setTimeout(() => {
            console.log(this.name); // Arrow Function: this는 obj (김철수)
        }, 1000);
    }
};
obj.sayHello();
// 출력:
// undefined
// 홍길동

 

 

룰렛 게임 완성하기

주어진 코드

<!DOCTYPE html>
<html>
  <head>
    <title>Roulette Game</title>
    <script></script>
  </head>
  <body>
    <div id="roulette">1</div>
    <button id="stopButton">정지</button>

    <script>
      const values = [1, 2, 3, 4, 5, 6];

      const rouletteDisplay = document.getElementById("roulette");

      let intervalId = null;

      let currentIndex = 0;

      function startRoulette() {
        intervalId = //interval 설정하기
      }

      document.getElementById("stopButton").addEventListener("click", () => {
        clearInterval(intervalId);

        alert("선택된 숫자: " + values[currentIndex]);
      });

      startRoulette();
    </script>
  </body>
</html>

 

완성된 코드

<!DOCTYPE html>
<html>
  <head>
    <title>Roulette Game</title>
  <style>
      #roulette { /* 룰렛 숫자가 표시될 div 요소의 스타일 */
        font-size: 48px; /* 글자 크기를 48px로 설정 */
        text-align: center; /* 텍스트를 가운데 정렬 */
        margin: 20px; /* 외부 여백을 20px로 설정 */
        padding: 20px; /* 내부 여백을 20px로 설정 */
        border: 2px solid #333; /* 2px 두께의 검은색(#333) 테두리 */
        width: 100px; /* div의 너비를 100px로 설정 */
        margin: 20px auto; /* 상하 여백 20px, 좌우 여백 auto로 가운데 정렬 */
      }
      #stopButton { /* 정지 버튼의 스타일 */
        display: block; /* 버튼을 블록 요소로 설정하여 한 줄 차지 */
        margin: 0 auto; /* 좌우 여백 auto로 가운데 정렬 */
        padding: 10px 20px; /* 상하 10px, 좌우 20px 내부 여백 */
        font-size: 16px; /* 글자 크기를 16px로 설정 */
        border: none; /* 테두리 제거 */
        cursor: pointer; /* 마우스 커서를 포인터로 변경 (클릭 가능 표시) */
      }
    </style>
  </head>
  <body>
    <!-- 룰렛 숫자가 표시될 div -->
    <div id="roulette">1</div>
    <!-- 룰렛을 멈추는 버튼 -->
    <button id="stopButton">정지</button>

    <script>
      // 룰렛에 표시될 숫자 배열 (const로 선언: 재할당 불가)
      const values = [1, 2, 3, 4, 5, 6];

      // DOM 요소: 룰렛 숫자가 표시될 div 요소 가져오기
      const rouletteDisplay = document.getElementById("roulette");

      // intervalId 변수: setInterval의 ID를 저장 (let으로 선언: 재할당 필요)
      let intervalId = null;

      // currentIndex 변수: 현재 표시 중인 숫자의 인덱스 (let으로 선언: 재할당 필요)
      let currentIndex = 0;

      // startRoulette 함수: 룰렛을 시작하는 함수
      function startRoulette() {
        // setInterval: 100ms마다 숫자를 변경하는 타이머 설정
        intervalId = setInterval(function() { // Arrow Function 대신 일반 function 사용
          // 현재 인덱스를 1 증가
          currentIndex = currentIndex + 1;

          // 만약 currentIndex가 배열의 길이(6) 이상이 되면 0으로 초기화 (순환)
          if (currentIndex >= values.length) { // % 연산 대신 if 조건문으로 변경
            currentIndex = 0; // 배열의 처음으로 돌아감
          }

          // 룰렛 div에 현재 숫자 표시
          rouletteDisplay.textContent = values[currentIndex]; // 현재 인덱스의 숫자를 div에 표시
        }, 100); // 100ms 간격으로 실행 (0.1초마다 숫자 변경)
      }

      // stopButton 클릭 이벤트 리스너: 버튼 클릭 시 룰렛 멈춤
      document.getElementById("stopButton").addEventListener("click", () => {
        // clearInterval: intervalId를 사용해 setInterval 중지
        clearInterval(intervalId);
        // 현재 선택된 숫자를 알림창으로 표시
        alert("선택된 숫자: " + values[currentIndex]);
      });

      // 페이지 로드 시 룰렛 자동 시작
      startRoulette();
    </script>
  </body>
</html>

 

Arrow Function 사용하여 완성된 코드
<!DOCTYPE html>
<html>
  <head>
    <title>Roulette Game</title>
    <!-- 스타일 추가: 룰렛과 버튼의 시각적 효과 개선 -->
    <style>
      #roulette { /* 룰렛 숫자가 표시될 div 요소의 스타일 */
        font-size: 48px; /* 글자 크기를 48px로 설정 */
        text-align: center; /* 텍스트를 가운데 정렬 */
        margin: 20px; /* 외부 여백을 20px로 설정 */
        padding: 20px; /* 내부 여백을 20px로 설정 */
        border: 2px solid #333; /* 2px 두께의 검은색(#333) 테두리 */
        width: 100px; /* div의 너비를 100px로 설정 */
        margin: 20px auto; /* 상하 여백 20px, 좌우 여백 auto로 가운데 정렬 */
      }
      #stopButton { /* 정지 버튼의 스타일 */
        display: block; /* 버튼을 블록 요소로 설정하여 한 줄 차지 */
        margin: 0 auto; /* 좌우 여백 auto로 가운데 정렬 */
        padding: 10px 20px; /* 상하 10px, 좌우 20px 내부 여백 */
        font-size: 16px; /* 글자 크기를 16px로 설정 */
        border: none; /* 테두리 제거 */
        cursor: pointer; /* 마우스 커서를 포인터로 변경 (클릭 가능 표시) */
      }
    </style>
  </head>
  <body>
    <!-- 룰렛 숫자가 표시될 div -->
    <div id="roulette">1</div>
    <!-- 룰렛을 멈추는 버튼 -->
    <button id="stopButton">정지</button>

    <script>
      // 룰렛에 표시될 숫자 배열 (const로 선언: 재할당 불가)
      const values = [1, 2, 3, 4, 5, 6];

      // DOM 요소: 룰렛 숫자가 표시될 div 요소 가져오기
      const rouletteDisplay = document.getElementById("roulette");

      // intervalId 변수: setInterval의 ID를 저장 (let으로 선언: 재할당 필요)
      let intervalId = null;

      // currentIndex 변수: 현재 표시 중인 숫자의 인덱스 (let으로 선언: 재할당 필요)
      let currentIndex = 0;

      // startRoulette 함수: 룰렛을 시작하는 함수
      function startRoulette() {
        // setInterval: 100ms마다 실행, intervalId에 저장
        intervalId = setInterval(() => {
          // currentIndex 증가, values 배열 길이를 초과하면 0으로 초기화 (순환)
          currentIndex = (currentIndex + 1) % values.length;
          // 룰렛 div에 현재 숫자 표시
          rouletteDisplay.textContent = values[currentIndex];
        }, 100); // 100ms 간격으로 숫자 변경 (빠르게 순환)
      }

      // stopButton 클릭 이벤트 리스너: 버튼 클릭 시 룰렛 멈춤
      document.getElementById("stopButton").addEventListener("click", () => {
        // clearInterval: intervalId를 사용해 setInterval 중지
        clearInterval(intervalId);
        // 현재 선택된 숫자를 알림창으로 표시
        alert("선택된 숫자: " + values[currentIndex]);
      });

      // 페이지 로드 시 룰렛 자동 시작
      startRoulette();
    </script>
  </body>
</html>

 

자바스크립트(Javascript)

  • 자바스크립트는 웹 페이지를 동적으로 만들어주는 스크립팅 언어입니다. 웹 브라우저 내에서 다양한 기능을 실행할 수 있으며, 이벤트 처리, 데이터 저장, DOM 조작 등을 가능하게 해줍니다.

 

자바스크립트의 기본 문법

  • 자바스크립트는 웹 페이지를 동적으로 만들기 위한 스크립팅 언어로, 주로 브라우저에서 실행됩니다.
  • HTML 문서에 <script> 태그를 사용해 삽입하거나, 별도의 .js 파일로 분리해 연결할 수 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>JS 기본 문법</title>
</head>
<body>
    <h1>자바스크립트 테스트</h1>
    <script>
        // 콘솔에 메시지 출력
        console.log("안녕, 자바스크립트!");

        // 경고창 표시
        alert("환영합니다!");
    </script>
</body>
</html>
  • 주석: // (한 줄 주석) 또는 /* */ (여러 줄 주석) 사용.
  • 세미콜론(;): 문장의 끝을 나타내며, 생략 가능하지만 명확성을 위해 사용하는 것이 좋습니다.
  • 대소문자 구분: 자바스크립트는 대소문자를 구분합니다. 예: myVarmyvar는 다른 변수입니다.

 

변수 선언과 데이터 타입

  • 자바스크립트에서 변수는 let, const, var 키워드로 선언할 수 있습니다.
  • var는 ES6 이후 권장되지 않으며, letconst를 주로 사용합니다.
  • 변수 선언
      - let: 재할당 가능한 변수.
      -
    const: 재할당 불가능한 상수 (단, 객체/배열 내부 값은 변경 가능).
let name = "홍길동"; // 변수 선언 및 초기화
name = "김철수";     // 재할당 가능
console.log(name);   // "김철수"

const age = 25;      // 상수 선언
// age = 30;         // 오류: const는 재할당 불가
console.log(age);    // 25
  • 자바스크립트는 동적 타입 언어로, 변수의 타입이 실행 중에 결정됩니다.
    - 기본(원시) 타입
        1. string: 문자열 (예: "안녕", '안녕')
        2. number: 숫자 (예: 42, 3.14)
        3. boolean: 참/거짓 (true, false)
        4. undefined: 값이 정의되지 않음
        5. null: 값이 없음
        6. symbol: 고유한 값 (ES6 도입)
    - 참조 타입
        1. object: 객체, 배열, 함수 등
let str = "바나나";        // string
let num = 123;            // number
let bool = true;          // boolean
let undef;                // undefined
let nul = null;           // null
let sym = Symbol("id");   // symbol

console.log(typeof str);  // "string"
console.log(typeof num);  // "number"

 

 

함수 정의와 호출

  • 함수는 특정 작업을 수행하는 코드 블록으로, function 키워드 또는 Arrow Function (화살표 함수, ES6 도입)으로 정의할 수 있습니다.
// 일반 함수 정의
function sayHello(name) {
    return "안녕, " + name + "!";
}
console.log(sayHello("홍길동")); // "안녕, 홍길동!"

// Arrow Function (화살표 함수)
const add = (a, b) => a + b;
console.log(add(3, 5)); // 8

 

Arrow Function 특징
 -  function 키워드 대신 => 사용
 -  한 줄일 경우 중괄호와 return 생략 가능
 -  this 바인딩이 다르게 동작 (렉시컬 this)

const multiply = (x, y) => {
    const result = x * y;
    return result;
};
console.log(multiply(4, 5)); // 20

 

 

객체와 배열의 사용 방법

  • 자바스크립트에서 데이터를 구조화하기 위해 객체와 배열을 사용합니다.

객체 (Object)
 - 객체는 키-값 쌍으로 데이터를 저장합니다.

// 객체 생성
const person = {
    name: "홍길동",
    age: 25,
    city: "서울",
    greet: function() {
        return `안녕, 나는 ${this.name}이야!`;
    }
};

// 객체 속성 접근
console.log(person.name);        // "홍길동"
console.log(person["age"]);      // 25
console.log(person.greet());     // "안녕, 나는 홍길동이야!"

// 속성 추가 및 수정
person.job = "개발자";
person.age = 26;
console.log(person); // {name: "홍길동", age: 26, city: "서울", greet: ƒ, job: "개발자"}

 

배열(Array)
 - 배열은 순서가 있는 데이터 목록 입니다.

// 배열 생성
const fruits = ["사과", "바나나", "오렌지"];

// 배열 요소 접근
console.log(fruits[0]); // "사과"

// 배열 메소드 사용
fruits.push("포도");    // 배열 끝에 추가
console.log(fruits);    // ["사과", "바나나", "오렌지", "포도"]

fruits.pop();           // 배열 끝 요소 제거
console.log(fruits);    // ["사과", "바나나", "오렌지"]

// 배열 순회
fruits.forEach(fruit => console.log(fruit));
// 출력:
// 사과
// 바나나
// 오렌지

 

Spread 구문 (ES6)
 - 배열이나 객체를 복사하거나 병합할 때 유용합니다.

const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // 배열 복사 및 확장
console.log(arr2); // [1, 2, 3, 4, 5]

const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // 객체 복사 및 확장
console.log(obj2); // { a: 1, b: 2, c: 3 }

 

Optional Chaining (ES2020)
 - 객체 속성에 안전하게 접근할 때 유용합니다.
const user = { name: "홍길동", address: { city: "서울" } };
console.log(user.address?.city);    // "서울"
console.log(user.phone?.number);    // undefined (오류 없이 안전하게 접근)

 

 

자주 사용하는 내장 함수들

  • 자바스크립트는 다양한 내장 함수와 메소드를 제공합니다.

 

문자열 관련

const str = "Hello, JavaScript!";

// 문자열 길이
console.log(str.length); // 17

// 문자열 자르기
console.log(str.slice(0, 5)); // "Hello"

// 대소문자 변환
console.log(str.toUpperCase()); // "HELLO, JAVASCRIPT!"
console.log(str.toLowerCase()); // "hello, javascript!"

 

숫자 관련

const num = 3.14159;

// 소수점 자르기
console.log(num.toFixed(2)); // "3.14"

// 랜덤 숫자 생성
console.log(Math.random()); // 0 이상 1 미만의 랜덤 숫자

// 절대값, 반올림
console.log(Math.abs(-5));  // 5
console.log(Math.round(3.6)); // 4

 

배열 관련

const numbers = [1, 2, 3, 4, 5];

// 배열 필터링
const evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // [2, 4]

// 배열 매핑
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

 

타이머 함수

// 2초 후 실행
setTimeout(() => console.log("2초 경과!"), 2000);

// 1초마다 반복
let count = 0;
const interval = setInterval(() => {
    console.log(`카운트: ${++count}`);
    if (count === 5) clearInterval(interval); // 5번 후 중지
}, 1000);

 

HTML 문서의 구조

  • HTML 문서는 DOCTYPE 선언으로 시작합니다. 이는 웹 브라우저에게 이 문서가 HTML5 문서임을 알려주는 역할을 합니다.
<!DOCTYPE html>
<html>
<head>
  <title>제목</title>
</head>
<body>
  <h1>h1</h1>
</body>
</html>

 

 

기본적인 HTML 태그들

  • <html>: HTML 문서의 시작과 끝을 나타냅니다.
  • <head>: 웹 페이지의 메타 정보를 담는 곳입니다. <title>, <style>, <meta>, <link>, <script> 등의 태그를 포함할 수 있습니다.
  • <title>: 웹 페이지의 제목을 설정합니다. 브라우저의 탭에 표시됩니다.
  • <body>: 웹 페이지의 본문을 나타내는 부분입니다. 웹 브라우저에 실제로 표시되는 내용을 담습니다.
  • <h1> ~ <h6>: 제목을 나타내는 태그입니다. <h1>이 가장 큰 제목이며, <h6>까지 숫자가 커질수록 글자 크기가 작아집니다.
  • <p>: 문단을 나타내는 태그입니다. 텍스트를 담는 데 사용됩니다.
  • <a>: 하이퍼링크를 만드는 태그입니다. href 속성에 링크할 URL을 지정합니다.
  • <img>: 이미지를 삽입하는 태그입니다. src 속성에 이미지 파일의 경로를 지정합니다.
  • <div>: 구역이나 섹션을 만드는 태그입니다. CSS와 함께 사용하여 웹 페이지의 레이아웃을 디자인합니다.
  • <span>: 인라인 요소를 그룹화하는 태그입니다. 텍스트 또는 다른 인라인 요소에 스타일을 적용하기 위해 사용합니다.
  • <table>: 테이블을 생성하는 태그입니다. <tr>, <td>, <th> 등의 태그와 함께 사용합니다.
        -   <tr>: 테이블의 행을 정의합니다.
        -    <td>: 테이블의 데이터 셀을 정의합니다.
        -    <th>: 테이블의 헤더 셀을 정의합니다.
  • <ul>과 <ol>: 목록을 만드는 태그입니다. <li> 태그와 함께 사용합니다. <ul>은 순서가 없는 목록을, <ol>은 순서가 있는 목록을 만듭니다.
  • <li>: 목록의 항목을 정의하는 태그입니다.
  • <form>: 사용자 입력을 위한 HTML 양식을 만드는 태그입니다. <input>, <textarea>, <button> 등의 태그와 함께 사용합니다.
  • <input>: 사용자 입력을 받는 필드를 만드는 태그입니다. type 속성을 이용해 다양한 종류의 입력 필드를 만들 수 있습니다.

더 많은 태그들은 아래 링크에서 확인할 수 있습니다. 바로가기

 

HTML elements reference - HTML: HyperText Markup Language | MDN

This page lists all the HTML elements, which are created using tags.

developer.mozilla.org

 


실습

  • 아래의 사진을 참고하여, 사과와 바나나를 소개하는 패이지를 제작하여 봅시다.
    - 두 개의 페이지는 서로 a태그를 이용하여 서로 연결되어 있습니다.
    - 제출 버튼을 눌렀을 때의 동작은 구현하지 않아도 좋습니다.

 

바나나페이지 HTML 코드(banana_page.html)

<!-- HTML5 문서임을 선언 -->
<!DOCTYPE html>
<html>
<head>
<!-- 문서의 문자 인코딩을 UTF-8로 설정 -->
    <meta charset="UTF-8"> 
    <style type="text/css">
        /* .my-box 클래스를 가진 요소에 바깥쪽 여백(margin) 20px 적용 */
        .my-box { margin:20px; }
    </style>
</head>

<body>
<!-- 전체 콘텐츠를 감싸는 div 박스, 클래스 이름은 my-box -->
<div class="my-box">

    <!-- 메인 제목과 수평선 -->
    <h1>바나나!</h1>
    <hr/>

    <!-- 바나나에 대한 소개 섹션 -->
    <h2>바나나에 대하여</h2>
    <p>
        바나나는 전 세계에서 가장 인기 있는 과일 중 하나입니다.
        바나나는 건강에 보호적인 영향을 미칠 수 있는 필수 영양요소를 함유하고 있습니다.
    </p>

    <!-- 이미지 삽입 -->
    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQCPa_h8cs0hRiNhReczSVsxqlK-3hGUBbQ2w&s" alt="바나나 이미지">

    <!-- 목록 태그 사용 -->
    <h2>바나나의 건강 이점</h2>
    <ul>
        <li>높은 섬이질 함량</li> <!-- 섬유질이 많음 -->
        <li>심장 건강</li>         <!-- 심장 건강에 도움 -->
        <li>소화 촉진</li>         <!-- 소화에 도움 -->
    </ul>

    <h2>맛있는 바나나 레시피</h2>
    <label>
        이메일: <br>
        <input type="text" name="member_email" id="member_email"> <br>
    </label>
    <label>
        당신의 좋아하는 바나나 레시피를 공유하세요. <br>
        <textarea rows="5" cols="60" name="contents"></textarea> <br>
    </label>
    <!-- 제출 버튼 (아직 동작은 없음) -->
    <button>제출</button>

    <!-- 사과 페이지로 이동하는 링크 -->
    <p><a href="apple_page.html">사과</a>에 대하여</p>

</div>
</body>
</html>

 

사과페이지 HTML 코드(apple_page.html)

<!-- HTML5 문서임을 선언 -->
<!DOCTYPE html>
<html>
<head>
    <!-- 문서의 문자 인코딩을 UTF-8로 설정 -->
    <meta charset="UTF-8">
    <style type="text/css">
        /* .my-box 클래스를 가진 요소에 바깥쪽 여백(margin) 20px 적용 */
        .my-box { margin:20px; }
    </style>
</head>

<body>
<!-- 전체 콘텐츠를 감싸는 div 박스, 클래스 이름은 my-box -->
<div class="my-box">

    <!-- 메인 제목과 수평선 -->
    <h1>사과!</h1>
    <hr/>

    <!-- 사과에 대한 소개 섹션 -->
    <h2>사과에 대하여</h2>
    <p>
        사과는 전 세계에서 널리 사랑받는 과일 중 하나입니다.
        사과는 다양한 영양소를 함유하고 있어 건강에 좋습니다.
    </p>

    <!-- 이미지 삽입 -->
    <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTTqBOfkJOBqR4ISvqOQBR8zG1NBlJfSKIWuw&s" alt="사과 이미지">

    <!-- 목록 태그 사용 -->
    <h2>사과의 건강 이점</h2>
    <ul>
        <li>높은 식이섬유 함량</li>
        <li>다양한 비타민과 미네랄</li>
        <li>항산화 물질 풍부</li>
    </ul>

    <h2>맛있는 사과 레시피</h2>
    <label>
        이메일: <br>
        <input type="text" name="member_email" id="member_email"> <br>
    </label>
    <label>
        당신의 좋아하는 사과 레시피를 공유하세요. <br>
        <textarea rows="5" cols="60" name="contents"></textarea> <br>
    </label>
    <!-- 제출 버튼 (아직 동작은 없음) -->
    <button>제출</button>

    <!-- 바나나 페이지로 이동하는 링크 -->
    <p><a href="banana_page.html">바나나</a>에 대하여</p>

</div>
</body>
</html>

 

HTML, CSS, JS의 기본 개념, 용도, 사용방법, 관계

  • HTML (HyperText Markup Language)
    - HTML은 웹페이지의 뼈대를 만드는 언어입니다.
    - 텍스트, 이미지, 링크, 버튼 등 페이지에 보이는 요소들을 배치하고 구조를 잡는 역할을 하며, 집을 짓는다면 벽과 기둥, 창문 같은 부분이 HTML입니다.
    - 예를 들어, 글을 쓸 때 제목을 정하거나 문단을 나누는 것도 HTML 태그를 이용하며, 이미지를 넣거나, 다른 페이지로 이동하는 링크를 만드는 것도 모두 HTML로 작성합니다.
  • CSS (Cascading Style Sheets)
    - CSS는 HTML로 만들어진 구조에 디자인을 입히는 역할을 합니다.
    - 색상, 글씨 크기, 글꼴, 여백, 레이아웃 등 시각적으로 보이는 모든 요소를 꾸며주는 스타일 시트 언어입니다.
    - 예를 들어, 배경을 파란색으로 바꾸거나 버튼을 둥글게 만들고, 글자를 가운데 정렬하는 등의 작업이 CSS를 통해 이루어집니다.
    - CSS 덕분에 웹페이지가 더 아름답고 보기 좋게 바뀌며, 사용자에게 좋은 인상을 줄 수 있습니다.
  • JavaScript
    - JavaScript웹페이지에 동적인 기능을 추가하는 프로그래밍 언어입니다.
    - 사용자의 행동(버튼 클릭, 입력 등)에 따라 페이지가 반응하도록 만들어줍니다.
    - 예를 들어, 버튼을 클릭했을 때 알림 창이 뜨거나, 입력한 값을 검사하는 기능, 페이지 내용이 실시간으로 변경되는 인터랙션 등이 모두 JavaScript의 역할입니다.
    - JS가 없으면 웹페이지는 단순히 정보를 보여주는 정적인 페이지에 머무르지만, JS를 사용하면 살아있는 웹페이지를 만들 수 있습니다.
구분 HTML CSS JavaScript
역할 구조 (Structure) 스타일링 (Design) 동작 (Interaction)
용도 웹페이지의 뼈대를 만든다 (텍스트, 이미지, 링크 등) 웹페이지를 꾸민다 (색상, 크기, 배치 등) 웹페이지를 동적으로 만든다 (버튼 클릭 시 이벤트, 데이터 처리 등)
작성 위치 .html 파일 .css 파일 .js 파일
<html>, <body> 내부에 작성 <style> 태그 안 <script> 태그 안
  link로 연결 src로 연결
관계 HTML이 기본 골격, CSS가 꾸밈, JS가 동작을 부여하는 관계    
세 가지가 함께 웹페이지를 완성함  

 

  • 웹페이지 제작에 필요한 기본적인 HTML 태그들

태그 설명 예시
<html> HTML 문서의 루트 <html> ... </html>
<head> 메타데이터, 외부 파일 연결 <head> <title>문서 제목</title> </head>
<body> 실제 페이지에 보이는 내용 <body> ... </body>
<h1> ~ <h6> 제목 (숫자가 작을수록 크다) <h1>큰 제목</h1>
<p> 문단 (Paragraph) <p>문장입니다.</p>
<a> 링크 (Anchor) 클릭
<img> 이미지 삽입 <img src="image.jpg" alt="설명">
<ul>, <ol>, <li> 목록 (순서 없는/있는) <ul><li>아이템</li></ul>
<table> <table><tr><td>셀</td></tr></table>
<div> 블록 영역 그룹화 <div>내용</div>
<span> 인라인 영역 그룹화 <span>내용</span>
<form>, <input> 입력 폼 <form><input type="text"></form>
<button> 버튼 <button>클릭</button>

 

  • CSS의 기본적인 문법과 속성들
    1. 주요 선택자
       - * : 모든 요소
       - 태그명 : 특정 태그
       - .클래스명 : 클래스 선택
       - #아이디명 : 아이디 선택
    2. 주요 속성들
    속성 설명 예시
    color 글자 색상 color: red;
    background-color 배경 색상 background-color: yellow;
    font-size 글자 크기 font-size: 16px;
    margin 바깥 여백 margin: 10px;
    padding 안쪽 여백 padding: 10px;
    border 테두리 border: 1px solid black;
    width, height 너비, 높이 width: 100px; height: 50px;
    display 요소 표시 방식 display: block;
    flex, grid 레이아웃 display: flex;

    3. 
    문법
선택자 {
  속성: 값;
  속성: 값;
}

 

 

  • JS의 기본적인 문법과 함수들
    1. 주요 기능 및 함수

    기능 설명 예시
    변수 선언 데이터를 저장 let name = "철수";
    함수 선언 코드 블록 저장 후 실행 function sayHi() { alert("안녕"); }
    조건문 분기 처리 if (a > 5) { ... } else { ... }
    반복문 반복 실행 for (let i = 0; i < 5; i++) { ... }
    이벤트 처리 사용자 상호작용 감지 element.addEventListener("click", 함수);
    DOM 조작 HTML 요소 변경 document.querySelector("p").textContent = "변경된 내용";
    내장 함수 alert(), console.log(), prompt() 등  

    2. 기본 문법
// 변수
let a = 10;
const b = 20;

// 함수
function greet() {
  console.log("안녕하세요!");
}

// 이벤트
document.querySelector("button").addEventListener("click", greet);

 

 


다음을 이해해 봅시다.

<!-- HTML 문서의 유형을 선언 (HTML5 문서임을 브라우저에 알림) -->
<!DOCTYPE html>

<!-- HTML 문서의 시작 -->
<html>

<!-- 문서의 메타데이터(스타일, 제목, 스크립트 등)를 담는 head 부분 -->
<head>
    <!-- 문서 내부에 CSS 스타일을 정의 -->
    <style>
        /* body 태그의 배경색을 연한 파란색으로 설정 */
        body {background-color: powderblue;}
        /* h1 태그(제목)의 글자색을 파란색으로 설정 */
        h1   {color: blue;}
        /* p 태그(문단)의 글자색을 빨간색으로 설정 */
        p    {color: red;}
    </style>
</head>

<!-- 문서의 본문 시작 -->
<body>

<!-- h1 태그: 큰 제목 표시 -->
<h1>h1태그</h1>

<!-- p 태그: 단락(문장) 표시 -->
<p>p 태그</p>

<!-- 버튼 생성, 클릭하면 changeColor() 함수 실행 -->
<button onclick="changeColor()">배경색 변경</button>

<!-- JavaScript 코드를 작성하는 영역 -->
<script>
    // changeColor 함수 정의
    function changeColor() {
        // 문서의 body 배경색을 노란색으로 변경
        document.body.style.backgroundColor = "yellow";
    }
</script>

<!-- 문서의 본문 종료 -->
</body>

<!-- HTML 문서 종료 -->
</html>

 

실행화면

<!-- HTML5 문서라는 것을 선언 -->
<!DOCTYPE html>

<!-- HTML 문서의 시작 -->
<html>

<!-- 문서의 본문 시작 -->
<body>

<!-- h2 태그: 중간 크기의 제목을 표시 -->
<h2>배열 이해하기</h2>

<!-- p 태그: id="demo" 인 문단 -->
<p id="demo"></p>

<!-- JavaScript 코드를 작성하는 영역 -->
<script>
    // 'cars'라는 이름의 배열을 선언하고, 문자열 요소 3개를 저장
    var cars = ["Saab", "Volvo", "BMW"];

    // id가 "demo"인 HTML 요소를 찾아서, cars 배열의 내용을 표시
    document.getElementById("demo").innerHTML = cars;
    // 결과: Saab,Volvo,BMW (배열 요소가 쉼표로 구분되어 출력됨)
</script>

<!-- 문서의 본문 종료 -->
</body>

<!-- HTML 문서 종료 -->
</html>

 

실행화면

 

 


실습

  • 자신을 소개하는 페이지를 작성해 봅시다(형식 자유)
<!-- HTML5 문서임을 선언 -->
<!DOCTYPE html>
<html> <!-- HTML 문서의 시작 -->

<head> <!-- 문서의 설정 및 스타일을 지정하는 부분 -->
    <title>나의 소개</title> <!-- 브라우저 탭에 표시될 제목 -->
    <style> <!-- CSS 스타일 정의 시작 -->
        body { /* body 태그 전체에 적용할 스타일 */
            background-color: #f0f8ff; /* 배경 색을 연한 파란색으로 지정 */
            font-family: Arial, sans-serif; /* 글꼴을 Arial 또는 sans-serif로 지정 */
            padding: 20px; /* 바깥 여백을 20픽셀로 지정 */
        }
        h1 { /* h1 태그에 적용할 스타일 */
            color: #3333cc; /* 글자 색을 파란 계열로 지정 */
        }
        p { /* p 태그(문단)에 적용할 스타일 */
            color: #000000; /* 글자 색을 검정으로 지정 */
            font-size: 18px; /* 글자 크기를 18픽셀로 지정 */
            line-height: 1.6; /* 줄 간격을 1.6으로 지정 */
        }
        button { /* 버튼에 적용할 스타일 */
            margin-top: 20px; /* 버튼 위 여백 20픽셀 */
            padding: 10px 20px; /* 안쪽 여백 위아래 10픽셀, 좌우 20픽셀 */
            background-color: #4CAF50; /* 배경 색을 녹색으로 지정 */
            color: white; /* 글자 색을 흰색으로 지정 */
            border: none; /* 테두리를 없앰 */
            border-radius: 8px; /* 모서리를 둥글게 8픽셀 */
            cursor: pointer; /* 마우스 올릴 때 포인터 모양으로 변경 */
        }
        button:hover { /* 버튼에 마우스를 올렸을 때 스타일 */
            background-color: #45a049; /* 조금 더 짙은 녹색으로 변경 */
        }
    </style> <!-- CSS 스타일 정의 끝 -->
</head> <!-- head 영역 끝 -->

<body> <!-- 웹페이지 본문 시작 -->

    <h1>안녕하세요! 👋</h1> <!-- 큰 제목으로 인사말 표시 -->
    
    <p>저는 보안관제로 근무중이며,모의해킹으로 이직을 하기 위해<br> 
       <strong>ELITE HACKER Bootcamp 4th</strong>를 배우고 있는 직장인입니다.</p> 
       <!-- 본문 소개 문장, <strong>은 강조 (굵게), <br>은 줄바꿈 -->
       
    <p>진행중인 <strong>pre.Web</strong>, <strong>pre.Rev</strong> 모두에 관심이 있어요.</p> 
    <!-- pre.Web, pre.Rev 과정에 관심 있다는 소개 -->

    <p><strong>pre.Web</strong> 코스를 다 끝내고 나면 <strong>pre.Rev</strong> 코스도 도전할 예정입니다!</p> 
    <!-- pre.Web 끝난 후 pre.Rev 도전할 계획 -->

    <p>취미는 🎮 게임, 🎤 노래 부르기 입니다!</p> 
    <!-- 취미 소개 -->

    <button onclick="alert('응원합니다! 화이팅!')">응원 받기</button> 
    <!-- 버튼 클릭 시 "응원합니다! 화이팅!" 알림이 뜨는 기능 -->

</body> <!-- 웹페이지 본문 끝 -->

</html> <!-- HTML 문서 끝 -->

 

실행결과

 

  • 간단한 계산기 페이지 만들기

<!-- HTML5 문서임을 선언 -->
<!DOCTYPE html>

<html>
<head>
	<!-- 브라우저 탭 제목을 "간단한 계산기"로 설정 -->
    <title>간단한 계산기</title>
</head>
<body>
	<!-- 페이지의 메인 제목 -->
    <h1>간단한 계산기</h1>

    <!-- 사용자가 계산식을 입력하는 텍스트 박스 -->
    <input type="text" id="expression" placeholder="계산식을 입력하세요">

    <!-- 버튼 클릭 시 calculate() 함수를 호출하여 계산 실행 -->
    <button onclick="calculate()">계산!</button>

    <!-- 결과가 출력될 영역 -->
    <p>Result: <span id="result"></span></p>

    <script>
        // 계산을 수행하는 함수 정의
        function calculate() {
            // 사용자가 입력한 수식을 가져옴
            var expression = document.getElementById("expression").value;

            // eval() 함수를 이용하여 수식 계산
            var result = eval(expression);

            // 계산된 결과를 HTML의 result 영역에 출력
            document.getElementById("result").innerText = result;
        }
    </script>

</body>
</html>

 

실행결과

프록시(Proxy)

  • 프록시(Proxy)중간에서 대신 요청을 전달하고 응답을 받아주는 중계 서버입니다.
  • 클라이언트(나)와 서버(목표) 사이에 위치해서, 내가 바로 서버에 접속하는 대신 프록시가 대신 요청하고, 응답도 프록시가 받아서 나에게 전달합니다.
  • 프록시의 사용 목적
    1. 익명성 보장 (IP 숨기기)
    2. 접근 차단 우회 (지역 제한 콘텐츠 접속 등)
    3. 캐싱 (속도 향상)
    4. 보안 검사 (기업 환경 등에서 웹 필터링)

 

 

웹 프록시 툴 종류

 

툴 이름 설명
Burp Suite 가장 유명한 웹 프록시 도구. 보안 테스트 시 필수. 트래픽 가로채기, 수정, 리플레이 가능.
OWASP ZAP 오픈소스 무료 프록시 툴. 자동 스캐닝 기능 탑재. 초보자에게도 친숙.
Fiddler 윈도우에서 많이 쓰는 HTTP 디버깅 프록시 툴. HTTPS 트래픽도 분석 가능.
Charles Proxy 주로 모바일 앱 트래픽 분석 시 사용. 직관적인 UI 제공.
Mitmproxy 터미널 기반 강력한 프록시. 스크립트화와 자동화에 강점.

 

 

 

프록시 서버

  • 프록시 서버는 앞서 설명한 프록시 역할을 하는 서버 그 자체입니다.
  • 프록시 서버의 종류
    - 포워드 프록시 (Forward Proxy): 내부 사용자가 외부에 접속할 때 사용
    - 리버스 프록시 (Reverse Proxy): 외부 사용자가 내부 서버에 접속할 때, 서버 앞단에서 요청을 받아 처리
    - 오픈 프록시 (Open Proxy): 누구나 사용할 수 있도록 개방된 프록시

 

 

VPN vs Proxy

  • VPN은 강력한 보안과 전체 네트워크 적용을 원할 때 사용합니다.
  • 프록시는 특정 앱만 IP 바꾸거나 빠르게 테스트할 때 사용합니다.
구분 VPN Proxy
암호화 전체 트래픽 암호화 (고급 보안) 대부분 암호화 안 함 (HTTP 프록시 기준)
적용 범위 컴퓨터/디바이스 전체 트래픽 특정 앱 또는 브라우저 트래픽만
속도 상대적으로 느릴 수 있음 (암호화 때문에) 보통 빠름 (경량화되어 있음)
익명성 IP 숨기기 + 트래픽 암호화 IP 숨기기만 (보안성 낮음)
사용 용도 공공 Wi-Fi 보안, 국가 차단 우회 등 가벼운 IP 우회, 테스트 목적 등

 

 


실습

  • 웹프록시 툴 설치하기
    - 블로그에 Brup Suite 설치 방법 작성해두었습니다. 바로가기
 

Burp Suite 설치 방법

Burp Suite 설치 방법입니다. http://portswigger.net/burp 접속합니다. Burp Suite - Application Security Testing Software Get Burp Suite. The class-leading vulnerability scanning, penetration testing, and web app security platform. Try for free to

security-student.tistory.com

 

  • 웹프록시 툴을 이용하여 패킷 변조해보기
    1. 브라우저 프록시 설정
        - Burp의 기본 프록시는 127.0.0.1:8080
        -  브라우저에서 프록시 설정을 Burp로 맞추면 브라우저 트래픽이 Burp로 전달됩니다.
        -  HTTPS 트래픽도 분석하려면 Burp의 CA 인증서를 브라우저에 설치해야 합니다.
    2. Intercept (인터셉트) 켜기
        -  Burp > Proxy > Intercept 탭 > "Intercept is on" 으로 활성화
        -  이제 브라우저 요청이 멈추고 Burp에서 보입니다.
    3. 패킷 수정 (변조)
        -  가로챈 HTTP 요청이나 응답을 자유롭게 수정 가능

1. 위 주소 접속화면이고, POST 요청으로 변경해야 하므로 Brup Suite를 실행합니다.

 

 

2. Brup Suite 실행 후 Intercept off를 클릭하여 Open browser를 클릭해서 브라우저를 접속합니다. 주소를 입력하여 확인 해보면 첫번째 줄에 GET / HTTP/1.1 을 확인할 수 있습니다.

 

 

3. 주소를 입력하여 확인 해보면 첫번째 줄에 GET / HTTP/1.1 을 확인할 수 있습니다.

 

4. GET /HTTP/1.1를 POST / HTTP/1.1로 변경하여 Forward 버튼을 클릭하여 Forward를 진행합니다.

 

5. 아래의 화면을 확인할 수 있습니다.

 

6. POST 요청의 'request' 파라미터를 'get-flag'로 설정해야하므로 요청 들어온 것을 오른쪽 클릭하여 Send to Repater를 클릭 후 상단에 Prpeator를 클릭하여 이동합니다.

 

7. 아래와 같이 화면을 확인할 수 있습니다.

 

8. 'request' 파라미터를 'get-flag'로 설정해야하므로 오른쪽 Inspector의 Request body paramters를 클릭하여 Name : request, Value : get-flag 를 입력하여 저장 후 Send 버튼을 클릭합니다.

 

9. 아래와 같이 Response 가 변경된 것을 확인할 수 있고 Request를 복사하여 Proxy로 이동하여 Request를 변경 후 Forward 버튼을 클릭하여 Forward를 진행합니다.

 

 

10. 아래의 화면을 확인할 수 있습니다.

 

11. User-Agent 헤더를 bot으로 설정하기 위해 위에 설명한 방법으로 다시 진행하여 Prpeator로 이동 후 Request에서 User-Agent 의 값을 bot로 변경하여 Send를 클릭합니다.

 

12. 아래와 같이 Response 가 변경된 것을 확인할 수 있고 Request를 복사하여 Proxy로 이동하여 Request를 변경 후 Forward 버튼을 클릭하여 Forward를 진행합니다.

 

13. 아래의 화면을 확인할 수 있습니다.

 

 

14. API_KEY가 SUp3r_STr0000ng_k3y인 Cookie 설정하기 위해 위에 설명한 방법으로 다시 진행하여 Prpeator로 이동 후 Request에서 Cookie: API_KEY=SUp3r_STr0000ng_k3y 입력하거나 Inspector의 Request cookies에 Name : API_KEY, Value : Up3r_STr0000ng_k3y를 입력 후 Add를 클릭합니다.

 

15. 아래와 같이 Response 가 변경된 것을 확인할 수 있고 Request를 복사하여 Proxy로 이동하여 Request를 변경 후 Forward 버튼을 클릭하여 Forward를 진행합니다.

 

16. SUCCESS를 확인하며 PLAG 값을 확인할 수 있습니다.

패킷(Packet)

  • 패킷네트워크를 통해 데이터를 주고받을 때 사용하는 작은 데이터 단위입니다.
  • 우리가 인터넷에서 보내는 데이터(예: 메시지, 파일, 웹 페이지)는 한 번에 보내지 않고, 일정 크기로 잘라서 패킷이라는 작은 조각들로 나눠 전송하며, 패킷들은 목적지에 도착하면 다시 원래의 데이터로 조립됩니다.

 

 

패킷의 필요성 및 용도

  • 패킷의 필요성
    1. 효율성: 데이터를 작게 나눔으로써 여러 사용자가 네트워크를 동시에 사용할 수 있게 합니다.
    2. 속도 향상: 작은 단위로 보내기 때문에 데이터 일부가 문제가 생겨도 전체를 다시 보낼 필요 없이 해당 패킷만 재전송하면 됩니다.
    3. 유연성: 패킷마다 다른 경로를 사용할 수 있어서 네트워크 혼잡 시 우회가 가능합니다.
    4. 신뢰성 향상: TCP 같은 프로토콜에서는 패킷 순서를 관리하고 오류를 검출하여 신뢰성 있게 데이터를 전달합니다.

  • 패킷의 용도
    1. 인터넷 통신의 기본 단위 (웹 페이지 로딩, 이메일 송수신, 동영상 스트리밍 등)
    2. 네트워크 장비 간 데이터 교환 (라우터, 스위치 등)
    3. 네트워크 분석 및 보안 (침입 탐지, 트래픽 분석 등)

 

 

패킷의 구조

  • 패킷을 간략하게 설명하면 헤더, 데이터(페이로드), 트레일러로 구성됩니다.

    구성 요소 설명
    헤더 (Header) 송신지/수신지 주소, 패킷 번호, 프로토콜 정보 등 전송에 필요한 정보
    데이터 (Payload) 실제 전송하려는 내용 (파일, 메시지, 웹페이지 데이터 등)
    트레일러(Trailer) (옵션) 오류 검출 코드(데이터가 손상되지 않았는지 검사)

 

  • Ethernet 패킷의 구조

    Preamble
    (7byte)
    SFD
    (1 byte)
    Destimation Address
    (6 byte)
    Source Address
    (2 byte)
    Type
    (2 byte)
    DATA
    (46 t0 1500 byte)
    FCS
    (4 byte)

    1. Preamble : 수신자가 동기화할 수 있도록 신호 패턴을 보내는 부분
    2. SFD (Start Frame Delimiter) : 프레임 시작을 알리는 표시
    3. Destination Address : 데이터의 목적지 MAC 주소
    4. Source Address : 데이터를 보내는 출발지 MAC 주소
    5. Type : 프레임 안에 있는 데이터의 프로토콜 종류를 나타냄
    6. Data : 실제 전송할 데이터(상위 계층 정보 포함)
        - ex) IP 패킷, TCP 패킷, UDP 패킷, ICMP 패킷 등
    7. FCS (Frame Check Sequence) : 데이터 오류를 검출하기 위한 검사 코드

  • IP 패킷의 구조

    VER (4 bits) HLEN (4 bits) Service type (8 bits) Total length (16 bits)
    Identification (16 bits) Flags (3 bit) Fragmentation offset (13 bits)
    Time-to-live (8 bits) Protocol (8 bits) Header Checksum (16 bits)
    Source IP Address (32 bits)
    Destination IP Address (32 bits)
    Options + Padding (0 to 40 bytes)

    1. VER: IP의 버전 정보, 0x4일 경우 IPv4를 의미
    2. HLEN: IP헤더의 길이로 이 필드 값에 4를 곱한 값이 실제 헤더의 바이트 길이
    3. Service type: 데이터그램을 어떻게 처리할지를 정의하는 서비스의 유형(최소 지연(Delay), 최대 처리율(MTU), 최대 신뢰성(Reliability), 최소 비용 설정(Cost)), 기본 값은 0
    4. Total length: 헤더를 포함한 데이터그램의 전체 길이를 의미
    5. Identification: 데이터그램이 단편화(Fragmentation)될 때 모든 단편에 이 값이 복사되고, 단편화 된 데이터그램이 생성될 때마다 1씩 증가
    6. Flag: 단편화 여부와 단편화된 조각이 첫 번째 조각인지, 중간 혹은 마지막 조각인지를 알려준다.
        - RF(Reserved Fragment): 아직 사용하지 않으므로 항상 0
        - DF(Don`t Fragment): 1이면 단편화되지 않았음을, 0이면 단편화되었음을 의미한다.
        - MF(More Fragment): 0이면 마지막 단편이거나 유일한 단편이고, 1이면 마지막 단편이 아님을 의미한다.
    7. TTL(Time-to-live): 라우팅 과정에서 라우터를 몇 개 이상 통과하면 해당 패킷을 버릴지를 결정
    8. Protocol: IP계층의 서비스를 사용하는 상위 계층 프로토콜을 정의(1: ICMP, 2: IGMP, 6: TCP. 17: UDP)
    9. Header checksum: 패킷 전달 중 발생할 수 있는 오류 검사를 위해 사용하는 것으로, 송신측에서 체크섬을 계산하여 전송
    10. Source IP address: 송신측 IP 주소
    11. Destination IP address: 수신측 IP 주소
    12. Options + padding: 해당 패킷에 대한 옵션 사항, 옵션 내용이 입력될 경우 그 값이 32배수로 데이터가 마무리되도록 0으로 채운다.
     
  • TCP 패킷의 구조

    Source port address (16 bits) Destination port address  (16 bits)
    Sequence number  (32 bits)
    Acknowledgment number  (32 bits)
    HLEN  (4 bits) Reserved  (6 bits) U
    R
    G
    A
    C
    K
    P
    S
    H
    P
    S
    T
    S
    Y
    N
    F
    I
    N
    Window size  (16 bits)
    Checksum  (16 bits) Urgent pointer  (16 bits)
    Options and padding  (up to 40 bytes)

    1. Source port address: 패킷의 출발지 포트 번호 / 
    Destination port address: 패킷의 목적지 포트 번호
    2. Sequence number: 패킷의 순서 값(순서번호)
    3. Acknowledgment number: 통신 상대의 패킷 순서 값(확인응답번호)
    4. HLEN: TCP헤더를 4바이트 단위의 개수로 나타낸 것
    5. Reserved: 나중에 필요할 때 사용하려고 남겨둔 공간
    6. Window size: 상대방이 반드시 유지해야 하는 바이트 단위의 창 크기
    7. Checksum: 데이터 오류 검출을 위한 값
    8. Urgent pointer: 긴급 플래그 값이 설정되었을 때만 유효하며 세그먼트가 긴급 데이터를 포함하고 있을 때 사용 됨 세그먼트의 데이터 부분에서 마지막 긴급 바이트의 번호를 구하기 위하여 순서 번호에 이 번호가 더해짐
    9. Options and padding: 옵션의 종류와 길이, 데이터를 저장 / 옵션이 32bits가 안되면 나머지 비트를 0으로 채움
 
  • UDP 패킷의 구조

    Source port number (16 bits) Destination port number (16 bits)
    Total length (16 bits) Checksum (16 bits)

    1. 
    Source port number: 패킷의 출발지 포트 번호
    2. Total length: UDP 헤더와 데이터 필드를 포함한 전체 패킷의 길이
    3. Checksum: 데이터 오류 검출을 위한 값
    4. Destination port number: 패킷의 목적지 포트 번호

 


 

와이어샤크(Wireshark)

  • Wireshark네트워크 상의 패킷을 캡처하고 분석할 수 있는 유명한 오픈 소스 도구입니다.
  • Wireshark 특징
    1. 실시간 패킷 캡처 및 분석
    2. 패킷을 상세히 분해해서 볼 수 있음 (헤더, 데이터 등)
    3. 다양한 프로토콜 지원 (TCP/IP, HTTP, DNS 등)
    4. 네트워크 문제 해결, 보안 분석, 교육용으로 활용
  • Wireshark 사용 예시
    1. 네트워크 문제 (지연, 손실 등) 원인 분석
    2. 해킹 시도, 이상 트래픽 탐지
    3. 프로토콜 학습 및 분석
    4. 서버나 클라이언트의 통신 흐름 파악
  • Wireshark 명령어 정리
    분류 필터 명령어 설명
    IP 주소 ip.addr == 192.168.0.1 특정 IP 주소와 관련된 모든 트래픽
    ip.src == 192.168.0.1 출발지 IP가 192.168.0.1 인 패킷
    ip.dst == 192.168.0.1 목적지 IP가 192.168.0.1 인 패킷
    포트 번호 tcp.port == 443 TCP 포트 443 (HTTPS) 사용하는 패킷
    udp.port == 53 UDP 포트 53 (DNS) 사용하는 패킷
    tcp.srcport == 80 출발지 포트가 80 인 TCP 패킷
    tcp.dstport == 443 목적지 포트가 443 인 TCP 패킷
    프로토콜 http HTTP 프로토콜 패킷
    https HTTPS 패킷 (주로 TCP 443 포트)
    dns DNS 쿼리 및 응답 패킷
    tcp TCP 프로토콜 패킷 전체
    udp UDP 프로토콜 패킷 전체
    MAC 주소 eth.addr == 00:11:22:33:44:55 특정 MAC 주소 관련 패킷
    eth.src == 00:11:22:33:44:55 출발지 MAC 주소가 특정 MAC 인 경우
    eth.dst == 00:11:22:33:44:55 목적지 MAC 주소가 특정 MAC 인 경우
    포함된 내용 frame contains "naver" 패킷 내에 "naver" 문자열이 포함된 경우
    AND / OR / NOT ip.addr == 192.168.0.1 && tcp.port == 80 IP가 192.168.0.1 그리고 TCP 포트가 80 인 패킷
    `ip.addr == 192.168.0.1
    !tcp TCP 프로토콜이 아닌 패킷
    에러 / 상태 tcp.analysis.flags TCP 재전송, 중복 ACK 등 문제 있는 TCP 패킷
    icmp ICMP (핑, 에러 메시지) 패킷
     

와이어샤크 실습

  • Wireshark를 사용하여 Naver접속 시 사용된 패킷 필터링하기
    1. Wireshark 실행 후 캡처 시작
    2. Wireshark에서 필터 입력
        - 명령어는 ip.addr 을 사용
        - 네이버 IP 확인 방법은 ping 을 보내서 확인
          개발자 도구(F12)를 켜둔 상태에서 Network 맨위의 www.naver.com 클릭하여 Headers에 Remote Address 확인
    3. 결과 확인
        -  TCP Handshake, TLS Handshake, 실제 데이터 전송까지 확인 가능

 

  • Wireshark를 사용하여 자신의 DNS 서버 정보 확인해보기
    1. Wireshark 실행 후 캡처 시작
    2. Wireshark에서 필터 입력
        - 명령어는 dns 를사용
    3. 결과 확인
        - KT의 DNS인 168.126.63.1 를 사용 중인 것을 확인할 수 있음

 

쿠키(Cookie)

  • 쿠키클라이언트(브라우저)에 저장하는 데이터입니다.
  • 쿠키의 특징
    1. 클라이언트에 저장(서버에 부담 적음)
    2. 유효 기간 설정 가능
    3. 브라우저에 저장되므로 보안에 상대적으로 취약함
    4. 크기 제한 있음(대략 4KB)
  • 쿠키의 동작 흐름
    1. 서버가 클라이언트에 쿠키 저장
    2. 브라우저는 쿠키 저장
    3. 클라이언트가 서버 요청 시 쿠키 자동 전송
    4. 서버는 쿠키를 읽고 처리

 

세션 (Session)

  • 세션서버에 저장하는 사용자 정보입니다.
  • 세션의 특징
    1. 서버에 저장(더 안전)
    2. 서버가 메모리에 저장하므로 서버에 부하 발생할 수 있음
    3. 일정 시간 동안 활동 없으면 세션 만료
    4. 서버에 있기 때문에 민감한 정보 저장 가능함
  • 세션의 동작 흐름
    1. 사용자가 로그인 → 서버가 세션 생성
    2. 서버가 세션 ID를 클라이언트에 전달 (보통 쿠키 사용)
    3. 사용자는 요청할 때마다 세션 ID 전달
    4. 서버는 세션 ID로 사용자 식별

 

쿠키와 세션의 발전 과정

  1. 초창기 웹은 상태가 없는 HTTP 프로토콜
      - HTTP는 무상태(Stateless) 프로토콜
      - 사용자가 서버에 요청할 때마다 "누가 보냈는지" 알 수 없음
      - 서버는 요청을 받을 때마다 매번 새 사용자인지 기존 사용자인지 모름
  2. 쿠키의 등장 (1994년, Netscape)
    -  HTTP의 한계를 보완하기 위해 쿠키 등장
    -  서버가 클라이언트에게 데이터를 저장하게 하고, 이후 요청마다 서버로 자동 전송
    -  사용자가 서버에 여러 번 접근할 때 같은 사용자라는 걸 알 수 있게 됨
    -  장점 : 로그인 유지, 사용자 식별, 맞춤형 서비스 제공
    -  단점 : 민감한 정보는 클라이언트에 저장되므로 보안에 취약
  3. 세션의 등장
    -  쿠키만으로는 민감한 정보를 다루기 어려움
    -  서버에 사용자 정보를 저장하고, 사용자에게는 세션 ID만 전달
    -  세션 ID는 보통 쿠키에 저장하거나 URL 파라미터로 전달
    -  서버가 관리하므로 보안이 강화됨
    -  장점 : 서버에서 관리하므로 보안성 높음
    -  단점 : 서버 메모리를 사용하므로 사용자가 많아지면 부하 발생
  4. 보안 강화를 위한 발전
    쿠키와 세션이 널리 쓰이면서 여러 보안 이슈 등장
      - 세션 하이재킹 (Session Hijacking)
      -  쿠키 탈취 (Cross-Site Scripting - XSS)
      -  CSRF (Cross-Site Request Forgery)
    보안 옵션 등장
      -   HttpOnly: JavaScript 접근 제한
      -   Secure: HTTPS에서만 전송
      -   SameSite: CSRF 방지
      -   세션 관리 기법 발전: 세션 타임아웃, 토큰 갱신, 서버 클러스터링 등
  5. 토큰 기반 인증 (JWT 등)
    - 서버 부하를 줄이고, 분산 시스템에서 인증을 원활히 처리하기 위해 JWT (JSON Web Token) 같은 토큰 기반 인증 방식 등장
    - 서버가 상태를 유지하지 않는 방식 (Stateless)으로 인증 가능
    - 특히 모바일 앱, 마이크로서비스 아키텍처에서 활발히 사용
    - 장점: 서버 메모리 사용 없음, 분산 시스템에 유리
    - 단점: 토큰 탈취 시 위험 (만료 시간 및 보안 처리 필수)

 


JWT (JSON Web Token)

  • JWT는 서버나 클라이언트가 정보를 JSON 형식으로 저장하고 전달하는 토큰 기반 인증 방식입니다.
    - JWT는 사용자가 누구인지 증명하는 데 사용되는 토큰입니다.
    - 토큰 안에 사용자의 정보가 암호화되어 들어 있고, 별도의 세션 저장소 없이 인증할 수 있게 해줍니다.
  • JWT 구조 : JWT는 총 3부분으로 구성됨 (xxxxx.yyyyy.zzzzz)
    1. Header(헤더)
        - 토큰 타입과 해시 알고리즘 정보
    {
      "alg": "HS256",
      "typ": "JWT"
    }

    2. Payload(페이로드)
        - 사용자 정보 (claims) 가 담긴 부분
        -  예: 유저 ID, 권한, 토큰 유효 기간 등
    {
      "sub": "1234567890",
      "name": "Alice",
      "iat": 1712311820
    }

    3. Signature(서명)
        -  위의 내용이 변조되지 않았음을 증명
        -  비밀 키로 생성 (예: HMAC SHA256)

    => 세 부분(1, 2, 3)이 base64로 인코딩되어 하나의 문자열로 만들어짐
  • JWT의 장점
    - Stateless: 서버가 세션을 저장할 필요 없음
    -
    확장성: 서버가 여러 대여도 세션 공유할 필요 없음
    -
    빠름: 토큰만 있으면 빠르게 사용자 검증
    -
    유연성: 모바일/웹/API 어디서나 사용 가능
  • JWT의 단점
    - 토큰 탈취 시 위험: 토큰이 유출되면 악용될 수 있음
    -
    토큰 폐기 어려움: JWT는 자체적으로 만료 전까지 유효. 서버가 토큰을 즉시 무효화하려면 별도 블랙리스트 관리가 필요
    -
    Payload가 암호화된 것은 아님 (Base64로 인코딩된 것이라 누구나 읽을 수 있음, 민감정보 저장 금지)

 


브라우저 저장소

 

저장소 데이터 크기 만료 기간 접근 범위 용도
쿠키 (Cookie) 매우 작음 (~4KB) 설정 가능 서버 & 클라이언트 인증 정보, 세션 식별자 등
Local Storage 크고 (~5MB) 없음 (영구 저장) 클라이언트 전용 사용자 설정, 캐시 데이터 등
Session Storage Local Storage와 유사
(~5MB)
브라우저 탭이 닫히면 삭제 클라이언트 전용 일회성 데이터, 탭 단위 저장
IndexedDB 매우 큼 (수백 MB 이상) 없음 클라이언트 전용 복잡한 구조화된 데이터 저장 (오프라인 앱 등)

 

  1. 쿠키 (Cookie)
    - 서버와 함께 사용하는 유일한 저장소
    - 매 요청마다 자동으로 서버에 전송됨
    - 세션 ID 저장 등 인증 목적으로 많이 사용
    - 용량이 적고, 서버로 전송되므로 주의 필요
    - 보안 옵션: HttpOnly, Secure, SameSite
    document.cookie = "token=abc123; path=/; max-age=3600";
     
  2. Local Storage
    - 브라우저에 데이터 영구 저장
    - 서버로 자동 전송되지 않음 (수동으로 꺼내서 사용해야 함)
    - 브라우저를 꺼도 남아있음
    - 용량이 쿠키보다 훨씬 큼 (~5MB)
    localStorage.setItem("theme", "dark");
    const theme = localStorage.getItem("theme");
     
  3. Session Storage
    - Local Storage와 비슷하지만 세션 단위 저장소
    - 브라우저 탭이나 창이 닫히면 데이터 삭제
    - 다른 탭이나 창과 공유되지 않음 (탭 고유 저장소)
    sessionStorage.setItem("tempData", "12345");
    const tempData = sessionStorage.getItem("tempData");
     
  4. IndexedDB
    - 구조화된 대용량 데이터를 저장하는 비관계형 데이터베이스
    - 오프라인 웹 애플리케이션에서 많이 사용
    - 비동기적으로 작동하고, 키-값 쌍으로 데이터 저장
    - 크기가 수백 MB까지 가능!
    - IndexedDB는 코드가 복잡해서 라이브러리를 주로 사용

 

 

 

HTTP(HyperText Transfer Protocol) 란?

  • HTTP하이퍼텍스트(HTML 문서 등)를 웹 브라우저와 서버 간에 주고받기 위한 프로토콜입니다.
  • HTTP웹 처리 전반에 걸친 토대가 되기 때문에 웹 서버를 HTTP 서버라고 부르기도 합니다.
  • HTTP의 동작 방식
    1. 클라이언트(브라우저)가 요청(Request)
      - URL 입력 → HTTP 요청 전송 (예: GET /index.html HTTP/1.1)
    2. 서버가 응답(Response)
      -  요청받은 웹 페이지나 파일을 HTTP 응답으로 반환
  • HTTP의 특징
    1. 텍스트 기반 : 사람이 읽을 수 있는 텍스트 형식
    2. Stateless(무상태) : 요청과 응답이 독립적
    3. 확장성 : 다양한 데이터 형식 전송 가능 (HTML, 이미지, 동영상 등)
    4. 포트 번호 : 기본 포트 80

 

 

HTTPS(HyperText Transfer Protocol Secure) 란?

  • HTTPS는 웹에서 데이터를 안전하게 주고받기 위한 프로토콜 HTTP에 SSL/TLS 암호화가 추가된 형태입니다.
    보안성, 신뢰성, 사용자 보호 강화를 위해 대부분의 웹사이트가 HTTPS 사용 중입니다.
  • HTTPS의 동작 방식
    1. 브라우저에서 HTTPS 주소 입력 (예: https://example.com)
    2. 서버가 인증서(SSL/TLS)를 제공
    3. 브라우저가 인증서 유효성 검증
    4. 데이터 암호화 후 통신 시작
  • HTTPS의 주요 특징
    1. 암호화 (Encryption) : SSL/TLS 기술로 통신 데이터를 암호화해서 중간에 탈취되어도 내용을 알 수 없음
    2. 인증 (Authentication) : 신뢰할 수 있는 기관(CA)으로부터 서버 인증서를 발급받아, 서버의 신원을 검증
    3. 무결성 (Integrity) : 데이터가 전송 중 변조되지 않았음을 보장
    4. 포트 번호 : 기본 포트 443

 

 

HTTP 와 HTTPS

구분 HTTP HTTPS
전체 이름 HyperText Transfer Protocol HyperText Transfer Protocol Secure
보안성 🔓 암호화 없음 🔒 SSL/TLS 암호화 적용
사용 포트 80 443
데이터 보호 전송 중 데이터 노출 가능 전송 중 데이터 암호화
신뢰성 상대적으로 낮음 인증서로 신원 검증 가능
사용 예 단순 정보 조회 로그인, 결제 등 민감한 데이터 처리 시 필수

 

 

HTTP 헤더, 바디의 구조

  • HTTP 메시지요청(Request), 응답(Response) 및 헤더(Header) 와 바디(Body) 로 나눌 수 있습니다.
    1. HTTP 요청(Request)
         - 시작줄 (Start Line)
               예 : GET /index.html HTTP/1.1
               의미 : index.html 파일을 가져와주세요
         - 헤더 (Headers)
              추가적인 정보 전달 (key: value 형식)
              예: Host: http://www.example.com
                    User-Agent: Mozilla/5.0
                     Accept: text/html
         - 바디 (Body)
              선택 사항
              데이터 전송 시 사용 (예: POST 요청에서 폼 데이터)
              예: username=chatgpt&password=secure
    2. HTTP 응답(Response)
         - 상태줄 (Status Line)
               예 : HTTP/1.1 200 OK
               의미 : 요청 성공적으로 처리했어요
         - 헤더 (Headers)
              응답 정보 제공
              예: Content-Type: text/html
                    Content-Length: 3057
         - 바디 (Body)
              실제 컨텐츠 (HTML, JSON 등)
              예: <html>
                      <body>
                          <h1>Welcome!</h1>
                      </body>
                    </html>

 


 

HTTP Method

1. GET 방식

- 데이터가 주소 입력란에 표시되므로 최소한의 보안도 유지되지 않는 취약한 방식

- 가장 일반적인 HTTP Request 형태로, 요청 데이터의 인수를 웹 브라우저의 URL로 전송
- 예시 : 웹 페이지 보기, 이미지 로딩

2.POST 방식

- 인숫값을 URL로 전송하지 않으므로 다른 사용자가 링크로 해당 페이지를 볼 수 없음

- 게시판의 경우: 목록이나 글 보기 화면은 접근 자유도를 위해 GET 방식을 사용 게시글을 저장·수정·삭제하거나 대용량
  데이터를 전송할 때는 POST 방식을 사용

- URL에 요청 데이터를 기록하지 않고 HTTP 헤더에 데이터를 전송
- 예시 :  회원가입, 로그인

3. 기타 방식

- OPTIONS 방식: 자원에 대한 요구/응답 관계와 관련된 선택 사항 정보를 요청할 때 사용
  예시 :  서버 기능 점검

- DELETE 방식: URI에 지정된 자원을 서버에서 지울 수 있게 함
  예시 :  게시글 삭제

- PUT 방식: 메시지에 포함된 데이터를 지정된 URI 장소에 그 이름으로 저장
  예시 :  게시글 전체 수정

- HEAD 방식: 서버 측 데이터를 검색하고 요청하는 데 사용
  예시 :  리소스 존재 여부 확인
- PATCH 방식 : 서버의 데이터를 부분 수정하는 데 사용
  예시 :  댓글 일부 수정
- TRACE 방식: 요구 메시지의 최종 수신처까지 루프백을 검사하는 데 사용

 

 

HTTP 상태코드

  • HTTP Response
    - 클라이언트의 HTTP Request에 대한 응답 패킷
    - 서버에서 쓰이는 프로토콜 버전, Request에 대한 실행 결과 코드, 간략한 실행 결과 설명문 내용이 담겨 있음
    - 추가 정보로 전달할 데이터 형식, 길이 등이 MIME 형식으로 표현되어 있음
    - 헤더 정보 뒤에는 실제 데이터(HTML 또는 이미지 파일)가 전달됨
    - 데이터 전달이 끝나면 서버 연결을 끊음

실행 결과 코드 내용 설명
100번대 정보 전송 HTTP 1.0까지는 계열에 대한 정의가 이루어지지 않았기 때문에 실험 용도 외에는 100번대 서버 측의 응답이 없다.
200번대 성공 클라이언트의 요구가 성공적으로 수신 및 처리되었음을 의미한다.
300번대 리다이렉션 해당 요구 사항을 처리하기 위해 사용자 에이전트가 수행해야 할 추가 동작이 있음을 의미한다.
400번대 클라이언트 측 에러 클라이언트에 오류가 발생했을 때 사용한다. 예를 들면 클라이언트가 서버에 보내는 요구 메시지를 완전히 처리하지 못한 경우 등이다.
500번대 서버 측 에러 서버 자체에서 발생한 오류 상황이나 요구 사항을 제대로 처리할 수 없을 때 사용한다.

 

 


 

SSL (Secure Sockets Layer)  인증서

  • SSL 인증서웹사이트와 사용자의 브라우저 간에 오가는 데이터를 암호화해서 정보를 안전하게 보호하는 기술입니다.
  • 현재는 SSL의 후속 버전인 TLS (Transport Layer Security) 가 더 많이 사용됩니다.
  • SSL 인증서가 왜 필요할까?
    1. 데이터 암호화 : 비밀번호, 신용카드 정보 등 민감한 데이터 보호
    2. 중간자 공격 방지 : 데이터가 가로채이더라도 해독 불가능
    3. 신뢰성 확보  :  주소창의 자물쇠 아이콘, HTTPS 사용으로 사용자의 신뢰 확보
    4. SEO 효과  :  구글 등 검색 엔진이 보안이 강화된 사이트를 우선 노출
  • SSL 인증서 작동 방식
    1. 클라이언트가 서버에 접속 → 안전한 통신을 위한 요청
    2. 서버가 SSL 인증서 전달
    3. 클라이언트가 유효성 검증
    4. 공개키 기반으로 암호화된 세션 키 전달
    5. 이후 세션 키로 양방향 암호화 통신!
  • SSL 인증서 종류

    종류 설명
    DV (Domain Validation) 도메인 소유 여부만 확인
    OV (Organization Validation) 기업 정보까지 검증
    EV (Extended Validation) 가장 강력! 기업 법적 존재 여부까지 검증, 주소창에 회사명 표시

 


실습

curl을 이용하여 HTTP요청 직접 보내보기

  • curl 이란?
    - curl command-line tool (명령줄 도구)로, URL을 통해 데이터를 전송하거나 받아올 수 있게 도와주는 프로그램이고, "Client URL" 의 줄임말입니다
  • curl 사용법

옵션 설명
-X HTTP 메서드 지정 (GET, POST, PUT, DELETE 등)
-d 요청 데이터 (POST, PUT 등)
-H 요청 헤더 추가
-F 파일 전송 (multipart/form-data)
-o 출력 파일 이름 지정
-O 원래 이름으로 파일 저장
-I 응답 헤더 출력
-L 리다이렉션 따라가기
-u 기본 인증 (user:password)
-c / -b 쿠키 저장 / 사용

 

 

1. Google 메인 페이지 GET 요청

curl -L https://google.com

 

2. 응답 헤더만 보기

curl -I https://google.com

 

3. 파일로 저장해보기

curl -L -o google.html https://google.com
# 저장된 파일 확인
cat google.html

 

4. User-Agent 변경해서 요청

curl -L -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" https://google.com


5. HTTPS 인증서 정보 확인

curl -v https://google.com
# 또는 더 자세히
curl -vI https://google.com


6. HTTP/2 로 요청

   - 윈도우 CMD 환경에서 실행 시

      curl: option --http2: the installed libcurl version does not support this
      curl: try 'curl --help' for more information
오류가 뜨며 리눅스에서 실행하였습니다.

   - 원인은 현재 윈도우에 깔려 있는 curl이 HTTP/2 프로토콜을 지원하지 않는다고 합니다.

curl -L --http2 https://google.com

 

7. 헤더 추가(Google 은 대부분 기본 헤더로 충분하지만, 실습용)

curl -L -H "Accept-Language: en-US" https://google.com

 

8. 쿠키 저장하고 재사용

curl -L -c cookies.txt https://google.com
curl -L -b cookies.txt https://google.com


9. 요청 시간 측정

   - 명령어를 실행하기 위해 curl-format.txt를 만들어야 한다.

#vi 편집기로 curl- format.txt 만들기
vi curl-format.txt

# 아래 명령어 입력 후 저장하기
melookup:  %{time_namelookup}\n
time_connect:  %{time_connect}\n
time_appconnect:  %{time_appconnect}\n
time_pretransfer:  %{time_pretransfer}\n
time_redirect:  %{time_redirect}\n
time_starttransfer:  %{time_starttransfer}\n
----------\n
time_total:  %{time_total}\n

   - curl-format.txt를 만든 후 아래 명령어를 실행하면 실행 결과를 확인할 수 있다.

curl -L -w "@curl-format.txt" -o /dev/null -s https://google.com

 

10. 요청 결과를 더 깔끔하게 보기(progress bar 안 보기)

curl -L -s https://google.com

 


웹 브라우저 개발자 도구를 사용하여 웹 사이트의 HTTP 통신을 살펴보기

1. 개발자 도구 열기

   - 웹사이트 열기 (예: https://google.com)

   - 단축키 : F12 또는 Ctrl + Shift + I 또는 마우스 우클릭 → "검사"

개발자 도구 화면

2. Network (네트워크) 탭 선택

   - 상단 탭에서 Network 선택

   - 이 탭에서 브라우저가 웹 서버와 주고받는 모든 요청/응답을 볼 수 있어요.

Network 화면

3. 페이지 새로고침

   - 개발자 도구는 새로고침하면서 모든 네트워크 트래픽을 기록합니다.

   - Ctrl + R 또는 주소창 옆 새로고침 버튼 클릭

 

4. HTTP 요청 분석하기

   - 요청 목록이 쭉 뜨면 원하는 요청 클릭

         Headers 탭 : 요청 URL, 요청 메서드 (GET, POST 등), 요청 헤더 / 응답 헤더, Status code (200, 301, 404 등)

         Preview 탭 : HTML, JSON 등 응답 본문 미리보기

         Response 탭 : 실제 응답 원본

         Timing 탭 : 요청 시간 분석 (DNS, 연결, 응답 속도)

HTTP 요청 화면

 

 


참고

https://security-student.tistory.com/22

 

Protocol

  • 프로토콜컴퓨터나 네트워크 장비들 사이에서 데이터를 주고받을 때 지켜야 하는 약속(규칙)입니다.
  • 프로토콜의 3가지 요소
    1. 구문(Syntax): 데이터의 구조나 포맷을 의미
    2. 의미(Semantics): 전송되는 데이터의 각 부분이 무엇을 뜻하는지 를 알 수 있게 미리 정해 둔 규칙(데이터 자체 뿐만 아니라 오류 제어, 동기 제어, 흐름 제어를 포함)
    3. 순서(Timing): 어떤 데이터를 보낼 것인지와 얼마나 빠르게 데이 터를 보낼 것인지 정의
  • 프로토콜의 기능
    1. 주소 설정(Addressing): 서로 다른 시스템의 두 개체가 통신을 하는 경우 필요
    2. 순서 제어(Sequence Control): 프로토콜 데이터 단위를 전송할 때 보내는 순서를 명시하는 기능(연결 지향형(Connection-Oriented)에만 사용)
    3. 데이터 분할과 재조합(Fragmentation & Reassembly): 대용량 파일을 전송할 때 전송 효율이 높은 작은 단위로 나누어 전송한 뒤 전송 받은 시스템에서 이를 재조합해야 함
    4. 캡슐화(Encapsulation): 데이터에 제어 정보를 덧붙이는 것(헤더)
    5. 연결제어(Connection Control): 연결 설정, 데이터 전송, 연결 해제에 대한 통제 수행
    6. 흐름 제어(Flow Control): 송신 측에서 오는 데이터의 양이나 속도를 조절하는 기능, 송신자와 수신자의 속도 차이에 대한 대응
    7. 오류 제어(Error Control): 두 개체 사이에서 데이터를 교환할 때 데이터에 오류나 변경이 있을 경우를 발견하는 기능
    8. 동기화(Synchronization): 두 개체 데이터를 교환할 때 서로 동시에 똑같이 정의된 인자 값 을 공유하는 것 정보를 송수신 할 때에 호흡을 맞추는 기능
    9. 다중화(Multiplexing): 통신 선로 하나에서 여러 데이터나 시스템을 동시에 통신할 수 있는 기법
    10. 전송 서비스(Quality of Service, QoS): 우선 순위 결정, 서비스 등급과 보안 요구 등을 제어하는 서비스

 

 


 

OSI 7 계층

  • OSI 7 계층네트워크에서 데이터를 주고받을 때의 과정을 7단계로 나눈 모델입니다.
  • OSI 7 계층물리 계층, 데이터 링크 계층, 네트워크 계층, 전송 계층, 세션 계층, 표현 계층, 응용 계층으로 나뉩니다.

사용자 기반 계층 응용 계층(Application Layer) 사용자 인터페이스 제공. 요구에 따른 정보처리
표현 계층(Presentation Layer) 전달되는 정보를 데이터로 표현, 암호화, 압축
세션 계층(Session Layer) 통신 시작, 유지/관리, 종료
트랜스포트 계층 전송 계층(Transport Layer) 종단간(응용 프로세스 간) 신뢰성 있는 메시지 전송(에러제어, 흐름제어, 혼잡제어)
네트워크 기반 계층 네트워크 계층(Network Layer) Datagram을 발신지(노드)에서 목적지(노드)까지 전달(라우팅)
데이터링크 계층(DataLink Layer) 노드간(물리적으로 연결된) 신뢰성 있는 전송 제공(에러제어, 흐름제어, 혼잡제어)
물리 계층(Physical Layer) 물리매체로 비트를 신호로 변경하여 전송(부호화, 기계적, 전기적 특성 제공)

 

 


 

TCP(Transmission Control Protocol)

  • TCP데이터를 안정적으로 전송하는 연결 지향형 프로토콜이고, IP와 함께 통신을 하는 데 반드시 필요한 가장 기본적인 프로토콜입니다.
  • TCP의 특징 높은 신뢰성
    1. 가상 회선 연결 방식
    2. 연결의 설정과 해제
    3. 데이터 체크섬(Checksum)
    4. 시간 초과와 재전송
    5. 데이터 흐름 제어

 

UDP(User Datagram Protocol)

  • UDP는 빠르게 데이터를 전송하는 비연결 지향형 프로토콜입니다.
  • 상대방이 보낸 응답을 확인하지 않아 네트워크에 부하를 주지 않습니다.
    데이터 자체의 신뢰성이 없어 수신한 데이터의 무결성을 보장받지 못합니다.
  • UDP의 특징
    1. 비연결 지향형
    2. 네트워크 부하 감소
    3. 비신뢰성
    4. 전송된 데이터의 일부가 손실

 


 

TCP와 IP의 연계

  • TCP/IP는 인터넷에서 데이터를 전송하는 표준 프로토콜 세트입니다.
  • 쉽게 설명하면, IP데이터 패킷이 목적지까지 가도록 안내하는 네비게이션 역할 TCP데이터가 정확히 도착했는지 확인하고, 순서를 맞춰주는 역할입니다.
    - IP (Internet Protocol)
       → 목적지까지 데이터 패킷을 전달하는 역할 (주소 지정 & 라우팅).
       → 데이터가 어디서 어디로 가야 하는지 알려주는 "배달 주소 역할
    - TCP (Transmission Control Protocol)
       → IP가 전달하는 데이터의 전송 품질을 보장하는 역할 (순서 보장, 오류 검사, 재전송).
       → 데이터를 안정적으로 주고받기 위한 안전한 배달 서비스 역할
  • TCP/IP의 데이터 전송 흐름
    1. TCP가 데이터를 분할
    2. IP가 패킷에 주소를 부여
    3. 수신 측에서 재조립

 


 

3-Way Handshake

  • TCP 프로토콜은 데이터 전송 전에 안전하고 신뢰성 있는 연결을 위해 3단계 과정(3-Way Handshake)을 사용합니다.
  • TCP 3-Way Handshake 연결 동작 과정
    1. 클라이언트 → 서버 : SYN
    - 클라이언트가 서버에게 연결 요청을 보냄
    - SYN 패킷(Synchronize) 전송
    2. 서버 → 클라이언트 : SYN + ACK
    - 서버가 요청을 받고, 연결 요청을 응답
    - SYN (동기화) + ACK (확인 응답) 패킷 전송
    3. 클라이언트 → 서버 : ACK
    - 클라이언트가 서버에게 다시 잘받았다는 것을 응답
    - 연결 완료

4-Way Handshake

  • 연결을 종료할 때도 안전하게 연결을 종료하기 위해 사용하는 4단계 과정(4-Way Handshak)을 사용합니다.
  • TCP 4-Way Handshake 연결 동작 과정
    1. 클라이언트 → 서버 : FIN
    - 클라이언트가 연결 종료를 요청
    - FIN (Finish) 패킷 전송
    2. 서버 → 클라이언트 : ACK
    - 서버가 확인 응답
    - ACK (Acknowledgment) 패킷 전송
    3. 서버 → 클라이언트 : FIN
    - 서버도 데이터를 전부 전송하고 종료 요청
    - FIN 패킷 전송
    4. 클라이언트 → 서버 : ACK
    - 클라이언트가 마지막 응답을 보냄
    - 연결 종료

 

IPv4, IPv6

  • IPv4, IPv6인터넷 통신을 위한 프로토콜(규칙)의 버전이며, 각각 32bit, 128bit의 주소 공각을 사용합니다.
  • IPv4인터넷의 초기 버전으로, 현재도 많이 사용되고 있지만 주소 부족의 문제IPv6개발되었습니다.
  • IPv4와 IPv6의 설명

      IPv4 IPv6
    주소 길이 32비트 128비트
    표기법 점(.)으로 구분된 10진수
    EX) 192.168.0.1
    콜론(:)으로 구분된 16진수
    EX) 2001:0db8:85a3:0000:0000:8a2e:0370:7334
    주소 개수  약 43억 개 약 340언데시틸리언 (거의 무제한)
    문제점 주소 부족: 약 43억 개 주소로 제한, 이미 거의 소진됨
    보안: IPSec 보안 기능은 선택 사항 (기본 제공 X)
    NAT 필요: 여러 기기가 하나의 IP를 공유해야 함
    확장성 부족: 기기 수 증가에 따른 한계
    전환 복잡성: 기존 IPv4에서 IPv6로의 전환 필요
    호환성 문제: 일부 오래된 장비나 소프트웨어는 IPv6 미지원
    장점 간편한 설정: IPv4는 오래 사용되어 익숙하고 관리가 쉬움
    광범위한 호환성: 대부분의 네트워크 장비 및 시스템이 IPv4 지원

    거대한 주소 공간: 사실상 무제한의 IP 주소
    자동 구성: Stateless Address Autoconfiguration (SLAAC)
    보안: IPSec 기본 제공
    빠른 라우팅 및 멀티캐스트 지원

 


 

DNS란? (Domain Name System)

  • DNS도메인 이름을 IP 주소로 변환해주는 시스템입니다.
    사람이 기억하기 쉬운 도메인 이름(예: www.example.com)을 컴퓨터가 이해할 수 있는 IP 주소(192.0.2.1)로 변환합니다.
  • DNS의 동작 원리
    1. 사용자가 웹 브라우저에 도메인 이름 입력
    2. DNS 서버가 도메인 이름을 IP 주소로 변환
    3. 변환된 IP 주소를 이용해 웹 서버 접속
    4. 원하는 웹 페이지 전달
  • DNS의 계층 구조
    - 가장 상위 개체는 ‘.’ (Root)
    - 두 번째 개체는 국가와 조직체의 특성
    - 보통 맨 앞은 자신의 DNS 서버에서 지정해 놓은 www, ftp와 같은 특정 서버의 이름이 옴
    - FQDN(Fully Qualified Domain Name) : 완성된 주소(예: www.example.com) 
    항목 내용 항목 내용
    com 영리 기관 mil 군사 기관
    net 네트워크 기관 edu 교육 기관
    org 비영리 기관 int 국제 기관
    gov 정부 기관 kr(Korea) 국가 이름
    DNS의 계층 구조
  • DNS 서버의 이름 해석 순서
    DNS 서버의 이름 해석 순서
    www.wishfree.com 에 접속하기 위한 순서
    1 | 캐시에 해당 사이트 정보를 확인
    2 | 캐시에 IP주소가 없을 경우에 hosts를 확인
    3 | 없으면 설정된 DNS 서버인 로컬 DNS 서버에 질의
    4 | 로컬 DNS에 없으면 루트 DNS에 질의
    5 | com DNS 서버에 질의
    6 | com DNS에도 없다면, wishfree.com DNS 서버에 질의
    7 | www.wishfree.com에 대한 IP 주소를 얻음
    8 | 로컬 DNS 서버는 이를 클라이언트에 전달 

 


 

포트

  • 포트네트워크에서 특정 서비스를 구분하는 논리적인 출입구입니다.
    IP 주소가 "어느 컴퓨터"인지를 알려준다면, 포트 번호는 "어떤 프로그램(서비스)"인지를 구분합니다.
  • 포트의 기능
    - 하나의 IP 주소에서 여러 서비스를 구분
    - 서버는 포트를 열어 두고 요청을 기다림
    - 클라이언트는 목적지 IP + 포트로 요청
  • 대표적인 포트 예시

    서비스 포트 설명
    HTTP 80 웹 사이트 접속 (보안 없음)
    HTTPS 443 암호화된 웹 접속 (보안 HTTPS)
    FTP 21 파일 전송 프로토콜
    SSH 22 원격 접속 (보안 쉘)
    DNS 53 도메인 이름 서비스
    SMTP 25 이메일 송신

 

 

포트포워딩

  • 포트포워딩외부에서 내부 네트워크의 특정 기기나 서비스에 접근할 수 있도록 라우터에서 포트를 지정하여 연결하는 기술입니다.
  • 포트포워딩이 왜 필요한가?
    1. 내부 네트워크(사설 IP)는 외부 인터넷에서 직접 접근 불가능
    2. 포트 포워딩을 통해 외부 요청을 내부 장비로 연결
  • 포트포워딩의 동작 원리
    1. 외부 요청: 외부에서 공인 IP + 포트로 요청
    2. 라우터 확인: 포트 포워딩 규칙에 따라 내부 IP + 포트로 전달
    3. 내부 장비 응답: 요청받은 내부 장비가 응답

 

 


참고

https://security-student.tistory.com/22 

 

 

웹(Web)

  • 은" 월드 와이드 웹(WWW, World Wide Web)"의 줄임말로, 인터넷을 통해 정보를  주고받을 수 있게 만든 정보 공유 시스템이며, "인터넷"이라는 통신망을 이용한 하나의 서비스입니다.
  • 아래의 그림과 같이 사용자는 웹브라우저로 접속하고, 인터넷을 통하여 웹서버는 요청받은 웹페이지(HTML, 이미지 등)를 보내주게 됩니다. 

 

 

 

인터넷(Internet)

  • 인터넷이란 인터 네트워크(Inter-network)이며, 네트워크 간의를 의미하고 네트워크와 네트워크를 연결한다라는 의미로 쓰입니다.
  • 전 세계가 연결되어있는 거대한 통신망을 의미하며, 실체는 존재하지 않는 추상적인 개념이며, 중앙 집중적이지 않고, 매우 복잡하게 얽힌 통신망입니다.
  • 유추해볼 수 있듯이 인터넷은 바로 네트워크간의 연결, 네트워크의 네트워크라는 뜻을 지니고 있습니다.

 


 

웹 서버(Web Server)

  • 웹 서버는 웹사이트의 데이터를 저장하고, 사용자가 요청하면 웹페이지(HTML, 이미지 등)를 전달해 주는 컴퓨터나 프로그램입니다.
  • 웹 서버하드웨어와, 소프트웨어의 구성으로 나눌 수 있습니다.
    - 하드웨어 : 웹사이트 데이터를 저장하는 실제 컴퓨터
    - 소프트웨어 : 요청을 처리하고, 웹페이지를 전달하는 프로그램
  • 웹 서버의 작동 원리
    1. 요청(Request) : 사용자가 브라우저에 주소(www.example.com)를 입력하거나 클릭해서 요청을 보냄
    2. 처리(Process) : 웹 서버가 요청을 받고, 해당 페이지가 있는지 확인 
    3. 응답(Response) : HTML 문서, 이미지, CSS 파일 등을 찾아서 사용자에게 전송
    4. 브라우저 표시 : 사용자의 웹브라우저가 웹 서버에서 받은 정보를 화면에 표시

 

웹 브라우저(Web Browser)

  • 웹 브라우저웹 서버에서 받은 정보를 사용자에게 보기 쉽게 보여주는 프로그램이며, 브라우저 덕분에 우리는 인터넷을 사용할 때 모든 웹페이지를 볼 수 있습니다.
  • 웹 브라우저는 Google Chrome, Safari, Microsoft Edge, Mozilla Firefox 등이 있습니다.
  • 웹 브라우저의 작동 원리
    1. URL 입력 : 사용자가 브라우저 주소창에 https://www.example.com 을 입력
    2. 서버 요청(Request) : 브라우저가 입력한 주소에 해당하는 웹 서버에 요청을 보냄
    3. 서버 응답(Response) : 웹 서버가 HTML, CSS, JavaScript, 이미지 등 파일을 브라우저에게 전달
    4. 렌더링(Rendering) : 브라우저가 받은 파일들을 해석하여 우리가 보는 화면으로 예쁘게 구성
    5. 사용자 인터랙션 : 사용자는 웹페이지를 클릭하거나 스크롤하면서 서버와 계속 소통

 

서버(Server), 클라이언트(Client)

  • 서버(Server)다른 컴퓨터(클라이언트)에게 정보를 제공하거나 서비스를 제공하는 컴퓨터나 프로그램입니다.
    쉽게 말하면, 누군가가 요청하면 필요한 데이터를 찾아서 전달하는 역할을 수행합니다.
    서버의 예시로는 웹 서버(Apache, Nginx), 메일 서버, 파일 서버, 게임 서버 등이 있습니다.
  • 클라이언트(Client)서버에 요청을 보내고, 서버가 보내주는 정보를 사용하는 프로그램이나 장치입니다.
    클라이언트의 예시로는 웹 브라우저(크롬, 사파리, 엣지 등), 이메일 앱(Gmail, Outlook 등), 게임 클라이언트(롤, 배틀그라운드) 등이 있습니다.

+ Recent posts