작업 3, 서블릿 생성
작업 4, 구구단 기초, 파라미터 x
작업 5, 구구단 파라미터 사용
작업 6, 파라미터에 따라서 텍스트의 색상 변경
작업 7, 서블릿이 JSP 파일에게 요청사항을 넘겨줘서 협업 가능하도록
작업 8, 서블릿으로부터 넘겨받은 파라미터 데이터를 jsp파일에서 활용
작업 9, DB 연결해서 데이터 가져오기
작업 10, 게시물 리스트 브라우저에 노출, 서블릿이 DB에서 가져온 데이터를 jsp 에게 넘겨주고 jsp에서 출력

구구단 표현

java는 콘솔에만 표현이 가능했는데 jsp는 브라우저와 통신이 가능하다

java와 jsp의 차이

JSP는 Java Server Pages의 약자이며, 
Java 웹 프로그래밍을 위해 사용되는 기술 중 하나입니다.
JSP는 HTML과 Java 코드를 혼합하여 동적 웹 페이지를 생성합니다.
JSP는 Java 언어를 기반으로 하기 때문에 Java와 비슷한 문법을 가지고 있습니다.

하지만 JSP와 Java는 몇 가지 차이점이 있습니다.
JSP는 HTML과 Java 코드를 함께 작성하는 것이 가능하기 때문에,
Java의 몇몇 기능을 JSP에서 사용할 수 없습니다. 예를 들어,
JSP에서는 Java의 static 변수나 static 메소드를 직접 사용할 수 없습니다.
또한, JSP에서는 Java 코드를 스크립트릿(<% %>) 안에 작성해야 하며, 세미콜론을 생략할 수 없습니다.

또한, JSP에서는 HTML 태그를 사용하여 출력을 제어할 수 있으므로,
Java에서는 없는 태그나 속성을 사용해야 할 때가 있습니다. 예를 들어, 
JSP에서는 jsp:include 태그를 사용하여 다른 JSP 파일을 포함할 수 있습니다.
또한, JSP에서는 표현식(<%= %>)을 사용하여 Java 코드의 결과를 HTML로 출력할 수 있습니다.

코드 까보기 컨트롤+u

'JSP' 카테고리의 다른 글

JSP 1일차 개발 환경 설정  (0) 2023.04.09

작업 1, JSPTest 첫 커밋
작업 2, 개요 및 개발환경세팅

클라이언트(송신자) - 우리(수신자)
자바 수신기(톰캣)랑 송신기(브라우저-크롬) 사용하는 법을 익힐 것

추가 과정

JSP 테스트 깃허브 만듬

버전 9
톰캣추가 64-bit Windows zip (pgp, sha512)

압출풀고 C:\workspace_cgh 폴더로 옮겨줌

C:\workspace_cgh\sts-4.18.0.RELEASE
파일에서
SpringToolSuite4.ini
파일 용량 늘려줌

emmet 추가하고 헬프에 jsp,jspf 추가해줌

헬프에 Latest Eclipse Release - https://download.eclipse.org/releases/latest
(플러그인,익스텐션 추가 추가기능 사용)

마지막꺼 펼쳐서
이클립스~자바스크립트 추가 체크

리스타트하고

src(일반폴더랑 주의)패키지 익스플로러-뉴-other-dy 다이나믹 있나 체크

다이나믹 클래스로 만들고 서버 연결

포트번호 8081로 바꾸고 만들어진 HomeMainservlet doget빼고 다 지움

@WebServlet("/home/main") 으로 바꾸고

response.getWriter().append("Hello World222222222").append(request.getContextPath());

'JSP' 카테고리의 다른 글

JSP 2일차 서블릿 생성과 DB 연결  (0) 2023.04.09

최소 공배수

초등학교 5학년 때 약수(divisor or factor)와 배수(multiple)를 배운 뒤에 최대공약수(greatest common divisor or greatest common factor) 와 함께 배우게 되는 내용. 공배수(common multiple)란, 이름에서 알 수 있듯이 두 수, 혹은 그 이상의 수들의 공통인 배수라는 뜻이다. 최소공배수(least common multiple)는 당연히 공배수 중에서 가장 작은 것. 두 수 �,�의 최소공배수를 기호로  혹은 로 표기하며,더욱 줄이면로 표기하기도 한다.

간혹 최공배수로 잘못 부르는 경우가 있는데, 최대공배수는 존재하지 않는다. 공배수는 한없이 커지므로, 가장 큰 숫자를 정의할 수 없기 때문. 마찬가지로 최공약수 또한 어떤 수 집합이든 무조건 1이므로 의미가 없다.

2. 찾는 법

예시로 두 수 10, 12의 공배수를 찾고 싶다고 하자. 먼저 두 수의 배수를 쭉 나열한다.
10: 10, 20, 30, 40, 50, 60, 70, ...
12: 12, 24, 36, 48, 60, 72, ...
여기서 위아랫줄 동시에 나타나는 수가 바로 공배수이다. 최소공배수는 앞서 설명했듯이 공배수 중 가장 작은 것. 이 예시의 경우에는 60이 최소공배수가 된다. 같은 방법으로 세 수 이상의 최소공배수도 구할 수 있다.

하지만 숫자를 나열하는 방법으로 최소공배수를 찾는게 힘들다면? 이 때는 소인수분해를 이용해서 최소공배수를 찾는다. 10과 12를 각각 소인수분해하면,
10=2⋅5
12=22⋅3
이제 중복되는 소인수는 차수가 큰 횟수만큼, 그리고 나머지 소인수를 모두 곱해주면 그 값이 최소공배수이다. 위 예시에서는 2를 두 번,[3] 3을 한 번, 그리고 5를 한 번 곱한 값, 즉 60이 최소공배수가 된다. 특히, 숫자가 서로소이면, 그냥 아무런 생각도 하지않고 두 수를 곱해주기만 하면 그 값이 최소공배수가 됨을 알 수 있다.

위에서 봤듯이 최소공배수는 대수학적으로는 그 성질을 다루기가 매우 까다롭기 때문에 특수함수에 속한다.

최대공약수 gcd⁡를 이용하는 방법도 있다. 최대공약수와 다음과 같은 관계가 성립한다:
lcm(a, b)=

단, 최대공약수도 최소공배수도 모를 경우 순환논법이 될 수 있음을 주의해야 한다.


 

최대 공약수

정수의 성질 중 하나. 초등학교 5학년 때 나오며, 약수(divisor or factor)에 대해서 먼저 배운 뒤, 바로 배우게 될 것이다. 먼저 공약수(common divisor or common factor)란, 이름에서 알 수 있듯이 두 수, 혹은 그 이상의 여러 수의 공통인 약수라는 뜻이다. 최대공약수 (greatest common divisor) 는 당연히 공약수 중 가장 큰 것. 두 수 의 최대공약수를 수학적 기호로 표시하면, 이며,더욱 줄여서 (로 표기하기도 한다. 특히,이면 두 수  서로소(relatively prime, coprime)라고 한다. 중1 입학하면 소인수분해랑 연계해서 더 심화된 과정으로 최소공배수랑 같이 또 나온다. 최대공약수ㆍ최소공배수는 약분과 통분, 분모가 다른 분수의 계산, 분수의 곱셈ㆍ나눗셈, 6학년 때 배우는 비의 성질, 비례식의 성질, 중1 정수와 유리수의 혼합계산, 방정식ㆍ부등식의 풀이 등 다방면으로 나온다.

가끔 최소공약수라고 잘못 부르는 경우가 있는데, 최소공약수는 무조건 1이므로 논할 가치도 없다. 반대로 최대공배수도 결국 무한으로 발산하므로 논할 가치 자체가 없다.

2. 찾는 법

예시로 두 수 12, 18의 공약수 및 최대공약수를 찾고 싶다고 하자. 간단하게, 두 수의 약수를 모두 나열한다.
12: 1, 2, 3, 4, 6, 12
18: 1, 2, 3, 6, 9, 18
여기서 위아랫줄 모두 같이 있는 숫자가 공약수가 된다. 즉, 이 경우에는 1, 2, 3, 6이 공약수가 된다. 최대공약수는, 찾은 공약수 중 가장 큰 것, 즉 이 경우에는 6이 최대공약수가 된다. 같은 방법으로 세 수 이상의 최대공약수도 구할 수 있다.

 

 

 

소인수 분해

 

합성수를 소수들의 곱으로 나타내는 것을 말한다.소수를 처음 배우는 중학교부터 자주는 아니더라도 계속 쓰이는 기본적인 수학 도구. 모든 합성수가 소인수분해된 형태를 가지고 있다는 것은 산술의 기본정리로 증명된다

 

https://www.youtube.com/watch?v=wsTEul5kzTs 소인수분해의 직관적 영상

 

배수 판정

정수 에 대해서,
  1. 2의 배수: 일의 자리 숫자가 짝수.
  2. 3의 배수: 각 자릿수의 합이 3의 배수.
  3. 4의 배수: 맨 뒤 두 자리가 00이거나 4의 배수.
  4. 5의 배수: 일의 자리가 0이거나 5인 경우.
  5. 6의 배수: 이 2의 배수이면서 3의 배수.
  6. 8의 배수: 맨 뒤 세 자리가 000 또는 8의 배수.
  7. 9의 배수: 각 자릿수의 합이 9의 배수.
  8. 10의 배수: 일의 자리가 무조건 0.
  9. 10n의 배수: 가장 끝의 n개의 자리가 모두 0.
  10. 7, 11, 13의 배수: 일의 자리부터 세 자리씩 끊은 뒤, 각 부분을 교대로 빼고 더한 값이 7, 11, 13의 배수.
  11. 15의 배수: 이 5의 배수이면서 3의 배수.
  12. 25의 배수: 맨 뒤 두 자리가 00 또는 25의 배수(25, 50, 75)
  13. 12의 배수: 이 3의 배수이면서 4의 배수.
  14. 20의 배수: 이 4의 배수이면서 5의 배수.
  15. 30의 배수: 이 5의 배수이면서 6의 배수.
  16. 48의 배수: 이 3의 배수이면서 16의 배수.
  17. 72의 배수: 이 8의 배수이면서 9의 배수.
  18. 27, 37의 배수: 일의 자리부터 3자리씩 끊은 뒤 이들을 모두 합한 결과가 27, 37의 배수인 수.

 

 

프로그래밍에서 소인수 분해를 쓸 때

 

프로그래밍으로 소인수를 구할 때는 위와 같은 자질구레한 규칙을 따질 필요 없이, 주어진 숫자 n의 소인수를 구한다고 할 경우 아래와 같은 순서로 진행하면 된다.

 

* 1. i=2로 시작하여 i++ 하면서 n%i == 0 인지 체크한다.
* 2. n%i==0이 성립하는 경우 i를 소인수로 등록한 후 n은 i로 나눈 값을 저장하고 i는 i++ 하지 않고 i부터 다시 시작하도록 한다.
* 3. n이 1이 될 때까지 위 과정을 반복한다.

 

 

어차피 작은 소수에서 n%i == 0이 성립하지 못한다면 그보다 큰 합성수는 n%i == 0가 성립하지 못하므로 n%i == 0이 성립하는 첫번째 i는 소수라는 점을 이용한 알고리즘이다.
이 알고리즘으로 소인수를 구하면 천억이 넘는 숫자도 소인수가 순식간에 구해진다.

간단하게 파이썬으로 코딩 해보면 다음과 같다.

 

# -*- coding: utf-8 -*-
import os
import sys

def find_prime(input_num):
    if input_num <= 2:
        return [input_num,]
    for idx in range(2,input_num):
        if input_num % idx == 0:
            ret_list = []
            val_a    = find_prime(idx)
            val_b    = find_prime(int(input_num/idx))
            ret_list = val_a + val_b
            return ret_list
    return [input_num,]

def main():
    try:
        input_num  = int(sys.argv[1])
    except:
        print("usage: python main.py <number>")
        print(" ex>   python main.py 12345")
        quit()
    prime_list = find_prime(input_num)
    check_num  = 1
    for prime_at in prime_list:
        check_num *= prime_at
    print("[%s] input_num=%d, check_num=%d" % (input_num == check_num, input_num, check_num))
    print("%s" % prime_list)

main()


다만 위의 프로그램은 프로그래밍을 익히는 용도로는 유용할수 있으나, 실제 소인수분해 용으로 쓰기에는 적합하지 않다. 실제로 컴퓨터로 다루는 수는 1000억은 '겨우'라는 소리가 나올만큼 큰 수를 다룰 필요가 있기 때문이다.

가장 쉬운 방법은 다른 프로그램을 이용해서 미리 소수 테이블을 작성해 두고, 이를 활용하는 것이다. 예를 들어 216 보다 작은 소수는 6542개인데, 이를 미리 배열에 저장해 두면, 42억 (=232 ) 보다 작은 수는 겨우 6542번 나누어 보기만 하면 소수인지 판정하거나, 1개 이상의 소인수를 구할 수 있다. 232 보다 작은 소수는 모두 약 2억개(203,280,221 개) 인데, 이를 미리 구해서 적절한 DB 에 저장해 두면 약 1844 (= 264 = 18,446,744,073,709,551,616) 보다 작은 수의 소인수 분해를 쉽게 할 수 있다.

20자리 정도 되는 이정도 수면 큰 수라고 생각할 수 있지만, RSA 암호화같은 암호학에서 기본 수백자리 수를 다뤄야 한다. RSA 넘버를 보면 가장 작은 것이 100자리 부터 시작하는데, 그마저 250자리 수 까지는 모두 소인수분해되었다. 가장 큰 RSA-2048 은 무려 617자리 수이다. 수의 단위 중 이름이 붙은 최고 단위인 구골이 101자리 수라는 것을 생각해보면, RSA 암호화에서 다루는 수는 사람에게는 어마어마하게 큰 수이다.

 

출처-나무위키

'기초수학 > 초~고등수학' 카테고리의 다른 글

순열  (0) 2023.03.17

SQL 인젝션이란 ?

SQL 인젝션은 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여 공격자가 원하는 데이터베이스의 중요한 정보를 가져오는 해킹 기법을 말한다.

 

SQL 인젝션의 종류와 공격 방법

Error based SQL Injection - 논리적 에러를 이용한 SQL 인젝션
앞서 예를 들어 설명한 기법이며 해당 기법으로 SQL 인젝션에 대한 기본을 설명하는게 일반적이다.

[로그인 예]

SELECT * FROM client WHERE name='anjinma' and password='12345';

SELECT * FROM client WHERE name='anjinma' and password=' or '1'=1

' or '1' = 1를 넣어서 1과 1이 같으면 참이므로 1 = 1참이다. or 은 앞에 값과 뒤에 값 중 하나라도 참이면 참이므로 이 구문은 참이 되어 로그인에 성공하게 된다.

UNION based SQL Injection = UNION 명령어를 이용한 SQL Injection

SQL UNION이란 ?

여러 개의 SQL문을 합쳐 하나의 SQL문으로 만들어주는 방법이다. UNION과 UNION ALL로 나뉘는데 중복 값을 제외하고 안하고의 차이다. UNION은 중복값을 제외하고 UNION ALL은 제외 하지 않고 전체를 합친다.

SELECT name from classa 
UNION
SELECT name from classb;

하게 되면 클래스 A와 클래스 B 이름들이 합쳐져서 출력된다. (중복된 이름을 제외하고) UNION으로 합쳐지는 두 테이블은 컬럼 갯수가 일치해야만 오류가 나지 않는다.

[외부 입력]

ID: 'test' UNION SELECT 1, 1 --
PW: anything

[실행 쿼리]

SELECT * FROM users WHERE ID = 'test' UNION SELECT 1, 1 -- AND PW = 'anything'

실행 쿼리대로 하면 users 테이블에 등록된 ID와 PW 목록을 전부 조회할 수 있게 된다.

Blind SQL Injection - Boolean based Blind SQL Injection

평번한 SQL 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술이다. 이것은 웹에서 SQL 삽입에 취약하나 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. 하지만 평범한 SQL 삽입과 다른점은 평범한 SQL 삽입은 쿼리를 삽입하여 원하는 데이터를 한번에 얻어낼 수 있는 데에 비해 Blind SQL 삽입은 참과 거짓, 쿼리가 참일때와 거짓일 때의 서버의 반응만으로 데이터를 얻어내는 기술이다. 즉, 쿼리를 삽입하였을 때 쿼리의 참과 거짓에 대한 반응을 구분할 수 있을때에 사용되는 기술이다. Blind SQL 삽입은 위 두 함수를 이용하여 쿼리의 결과를 얻어 한글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참과 거짓을 비교하는 과정을 거쳐가며 계속 질의를 보내어 일치하는 아스키코드를 찾아낸다. 그러한 과정을 반복하여 결과들을 조합하여 원하는 정보를 얻어냄으로써 공격을 이루어지게 한다. 많은 비교과정이 필요하기 때문에 악의적인 목적을 가진 크래커들은 Blind SQL 삽입 공격을 시도할 때에 자동화된 툴을 사용하여 공격한다. 취약점이 발견된다면 순식간에 많은 정보들이 변조되거나 크래커의 손에 넘어가게 된다.

Blind SQL Injection - Time based SQL

어떤 경우에는 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우가 있을 수 있다. 이런 경우 시간을 지연시키는 쿼리를 주입(injection)하여 응답 시간의 차이로 참과 거짓 여부를 판별할 수 있다.

정리하면 Blind SQL 인젝션 기법은 쿼리가 참, 거짓일 때 서버의 반응만으로 데이터를 얻어낼 수 있는 공격 기법이다. 이 기법은 여러 조건에 대한 과정을 거쳐야 필요한 정보를 얻을 수 있기 때문에 코드를 짜거나 자동화 도구로 보통 공격하는게 일반적이다.

SQL 인젝션 대응방안

MySQL의 경우 mysqli_real_escape_string(); 함수를 사용하는 방법이 있다.
SQL에서 특별한 의미를 갖는 문자들을 이스케이프해서 SQL 삽입을 방지하는 방법이다.

 

출처:https://velog.io/@ragnarok_code/DataBase-SQL-%EC%9D%B8%EC%A0%9D%EC%85%98%EC%9D%B4%EB%9E%80

  • hover 이벤트, 높이 맞추기, this, find, children, height

 

 

 

 

커서를 올리는곳에 따라 빈 여백이 채워진다

 

 

 

시도 2와 합쳐보면 이렇게 여백만큼 채워준다

 

 

 

 

 

최종적인 모습

https://codepen.io/guenhyuck/pen/gOBYzRx

 

이미지 삽입과 자바스크립트를 이용한 화면 구현

 

 

https://codepen.io/guenhyuck/pen/XWxrEox

/* 탑바 */
.top-bar {
  height: 72px;
  border-bottom: 1px solid #f4f4f4;
}

.top-bar > .con > .menu-box-1 > ul > li > a {
  font-weight: bold;
  color: #1e1e1e;
  font-size: 17px;
  padding: 0 15px;
  position: relative;
}

.top-bar > .con > .menu-box-1 > ul > li > a::after {
  content: "";
  position: absolute;
  bottom: 0;
  background-color: black;
  left: 0;
  width: 0;
  transition: width 0.3s;
  height: 3px;
}

.top-bar > .con > .menu-box-1 > ul > li:hover > a::after {
  width: 100%;
}

/* 2차메뉴 */
.top-bar > .con > .menu-box-1 > ul > li {
  position: relative;
}

.top-bar > .con > .menu-box-1 > ul > li > ul {
  display: none;
  position: absolute;
  left: 12px;
  padding: 17px 0;
}

.top-bar > .con > .menu-box-1 > ul > li:hover > ul {
  display: block;
}

.top-bar > .con > .menu-box-1 > ul > li > ul > li > a {
  font-size: 17px;
  color: #666666;
  display: block;
  padding: 10px 0;
  white-space: nowrap;
  font-weight: bold;
}

.top-bar > .con > .menu-box-1 > ul > li > ul > li:hover > a {
  color: #1e1e1e;
}

이전에서 백그라운드 컬러를 지우고

2차 메뉴를 삽입,정렬하며 나오게끔까지 구현

 

 

https://codepen.io/guenhyuck/pen/NWOKyEP

<!-- 유용한 링크 -->
<!-- cdnsj : https://cdnjs.com/ -->
<!-- 폰트어썸 아이콘 리스트 : https://fontawesome.com/icons?d=gallery&m=free -->

<!-- 구글 폰트 불러오기 -->
<!-- rotobo(400/700/900), notosanskr(400/600/900) -->
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;900&family=Roboto:wght@400;700;900&display=swap" rel="stylesheet">

<!-- 폰트어썸 불러오기 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">

<!-- 제이쿼리 불러오기 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>

<div class="top-bar">
  <div class="con height-100p flex flex-jc-sa">
    <a href="#" class="logo flex flex-ai-c">
      <img src="https://kakaopaysec.com/resources/images/bi.png" alt="">
    </a>

    <nav class="menu-box-1">
      <ul class="height-100p flex">
        <li><a href="#" class="flex flex-ai-c height-100p">회사소개</a></li>
        <li><a href="#" class="flex flex-ai-c height-100p">비즈니스</a></li>
        <li><a href="#" class="flex flex-ai-c height-100p">경영정보</a></li>
        <li><a href="#" class="flex flex-ai-c height-100p">고객센터</a></li>
        <li><a href="#" class="flex flex-ai-c height-100p">채용정보</a></li>
      </ul>
    </nav>
  </div>
</div>


/* 노말라이즈 */
body,
ul,
li,
h1 {
  margin: 0;
  padding: 0;
  list-style: none;
}

a {
  color: inherit;
  text-decoration: none;
}

label[for] {
  cursor: pointer;
  user-select: none;
}


/* 탑바 */
.top-bar {
  height: 72px;
  background-color: #afafaf; /* 임시 */
  border-bottom: 1px solid #f4f4f4;
}

.top-bar > .con > .menu-box-1 > ul > li > a {
  font-weight: bold;
  color: #1e1e1e;
  font-size: 17px;
  padding: 0 10px;
  position: relative;
}

.top-bar > .con > .menu-box-1 > ul > li > a::after {
  content: "";
  position: absolute;
  bottom: 0;
  background-color: black;
  left: 0;
  width: 0;
  transition: width 0.3s;
  height: 3px;
}

.top-bar > .con > .menu-box-1 > ul > li:hover > a::after {
  width: 100%;
}

상단의 로고와 메뉴만 클릭하게 만들어 놓은 상태

 

 

 

리팩토링을 할 수록 진화를 한다는 걸 비유하는것 같은 재미있는 사진

사실 왜 하는지 이해는 하지만 초보자의 입장에선 버겁기만 하다 그럼에도 필수적인 코드 리팩토링, 왜 하는지 알아보자

 

리팩토링은 코드의 구조나 설계를 개선하고 유지보수성을 높이기 위해 코드를 수정하는 과정을 말합니다. 리팩토링을 통해 코드를 개선함으로써 다음과 같은 이점이 있다

1.코드 가독성 개선 : 코드의 가독성을 높여서 코드를 이해하고 수정하기 쉬워짐

2.코드 재사용성 증가 : 코드를 적절하게 분리하고, 중복을 제거하여 코드 재사용성을 높임

3.유지보수성 개선 : 코드를 단순화하고, 결합도를 낮추어서 유지보수성을 높임

4.버그 발견 용이 : 코드를 정리하고, 개선함으로써 잠재적인 버그를 미리 발견하고 수정

5.생산성 향상 : 코드를 개선함으로써 생산성을 향상

 코드를 지속적으로 유지보수하고 개선함으로써 코드의 질을 높일 수 있으며, 이는 소프트웨어의 품질과 안정성을 향상시키는 데 도움을 준다 리팩토링은 소프트웨어 개발에서 필수적인 과정 중 하나이다

당연하게도 한곳에 올인했다가 날아가면 망하는것이고

규모가 클 수록 관리,가독성도 낮아지고 어려워진다

합리적이고 효율적인 프로그래밍을 위한 필수의 과정인것이다.




Regenerate respon

클라이언트와 서버는 무슨 관계일까

클라이언트는 네트워크를 통해 서비스를 요청하는 컴퓨터나 장치를 말한다 예를 들어, 웹 브라우저를 사용하여 인터넷에서 웹 페이지를 요청할 때, 해당 웹 브라우저는 클라이언트 역할을 한다. 클라이언트는 서버에게 요청을 보내고, 서버로부터 응답을 받아서 그 결과를 화면에 출력한다.

반면에 서버는 네트워크에서 클라이언트의 요청을 받아서 처리하고, 그 결과를 클라이언트에게 전송하는 컴퓨터나 장치 예를 들어, 인터넷에서 웹 페이지를 요청받아 해당 페이지를 제공하는 컴퓨터는 서버 역할을 한다.

즉, 클라이언트와 서버는 서로 다른 역할을 하면서 서로 통신하여 네트워크에서 데이터를 주고받는다. 클라이언트는 서비스를 요청하고, 서버는 요청된 서비스를 제공하는 역할을함. 이러한 클라이언트-서버 모델은 인터넷이나 로컬 네트워크에서 매우 중요한 역할이다

'DB > DB 필요한 지식' 카테고리의 다른 글

SQL 인젝션이란?  (0) 2023.04.09
포트 포워딩이란?(port forwarding)  (0) 2023.04.08
Primary key,foreign key 비교와 그 외의 key들  (0) 2023.03.17

자바를 주로 하고 db는 곁들이는 식으로 가지만 포트 포워딩이란 개념은 항상 등장한다

지금은 자세히 몰라도 된다지만 궁금하기에 찾아보았다

포트 포워딩(영어: port forwarding) 또는 
포트 매핑(영어: port mapping)은 컴퓨터 네트워크에서 패킷이
라우터나 방화벽과 같은 네트워크 게이트웨이를 가로지르는 동안 
하나의 IP 주소와 포트 번호 결합의 통신 요청을 다른 곳으로 넘겨주는 네트워크 주소 변환(NAT)의 응용이다
. 이 기법은 게이트웨이(외부망)의 반대쪽에 위치한 보호/내부망에 상주하는 호스트에 대한 서비스를 생성하기
위해 흔히 사용되며,
통신하는 목적지 IP 주소와 포트 번호를 내부 호스트에 다시 매핑함으로써 이루어진다

-출처 위키백과

 

무슨 뜻인지 모르겠다 일단 용어 풀이부터 해보자

 

규칙 : 어떤 포트에 어떤 대상을 연결할지 정하는 것
규칙 이름 : 여러 규칙을 식별하기 위함
프로토콜 : 네트워크 접속 방식
호스트IP : 라우터(여기서는 VirtualBox의 가상라우터) IP
호스트포트 : 라우터를 통해 접근하고자 하는 게스트IP와 매핑할 포트번호
게스트IP : 접근하고자 하는 대상 사설 IP
게스트포트 : 게스트 OS에서 접근하자고 하는 프로세스(프로그램, 서비스) 포트

네트워크에서 ~P로 끝나는건 대부분 프로토콜이다 여기서 계속 등장하는 ip에 대해 더 알아보자

 

 아이피

포트 포워딩을 이해하려면, 우선 필요한 개념이 여러가지가 있는데,
그 중 중요한 것이 공인, 사설, 외부, 내부 아이피다.

  • 아이피란?IP 주소를 줄여 IP라고 부르기도 하나, 이는 인터넷 규약을 가르키는 말이기 때문에 구분해야 한다.
    하지만, 쉬운 이해를 위해 이 글에서는 ‘아이피’로 줄여서 부르겠다.
  • IP 주소는 Internet Protocol Address 의 약자로 컴퓨터 네트워크에서 장치들이 서로를 인식하고 통신하기 위해 사용하는 특수한 번호이다.
  • 공인 아이피란?각 공인 아이피는 세상에서 유일한 주소를 가진다.
  • 공인 아이피는 유일한 값이기 때문에 중복되지 않는다.
    0~225까지의 숫자 4개로 구성되는 IPv4는 약 42억개의 주소만 할당할 수 있고,
    이를 전세계 모든 장비에 할당하기에는 현재 아이피 체계가 많이 부족하다.
    그래서 외부 네트워크가 필요하지 않은 장비에 대해서는 별도의 사설 네트워크를 구축하게 된다.
  • 인터넷 상에서 다른 PC와 통신하기 위해 필요한 아이피로 서버를 구축하거나, 각자의 PC에 인터넷을 연결하는 경우, 인터넷을 통한 통신을 하기 위한 아이피다.
  • 사설 아이피란?주변에서 흔하게 볼 수 있는 예로 공유기를 활용한 구성으로, 공유기를 활용해 망을 구성하면 보통 192.168.x.x 형태로 구성되는데, 이를 사설 아이피라고 한다.
  • 사설 아이피는 내부망에서만 사용되기 때문에, 서로 다른 내부망에서는 동일한 사설 아이피를 가져도 상관없다.
  • 내부 네트워크 상에서 각 컴퓨터 간 통신하기 위해 필요한 아이피로 내부망을 구축할 때 활용하는 아이피다.
  • 외부 아이피란?공인 아이피와 외부 아이피가 동일 시 되는 경우가 많은 것 같은데, 알아본 바에 따르면 엄연히 다른 개념인 것을 알 수 있다.
    대체로, 현재 포함된 네트워크가 인터넷 망과 공유기를 통해 연결된 경우가 대부분이지만,
    별도의 네트워크를 설정하지 않은 가상머신을 사용하는 경우, 가상머신의 외부 아이피는 가상 머신을 구동하는 PC의 내부 아이피를 가진다.
    (가상 머신의 외부 네트워크는 가상 머신을 구동하는 PC기 때문이다.)
  • 기기가 현재 포함된 네트워크를 외부의 네트워크를 외부 네트워크라 부르고,
    이 외부 네트워크와 통신할 때 사용하는 아이피다.
  • 내부 아이피란?
  • 기기가 현재 포함된 네트워크 내부에서 사용하는 아이피다.

그래서 포트 포워딩이 필요한 이유는?

 

포트 포워딩이 필요한 이유

  • 포트 포워딩이란?별도의 설정 없이 외부 아이피가 접속을 시도할 때, 내부에 어떤 프로세스(서비스) 또는 기기와 연결할 지 알 수 없기 때문에 접근이 불가능하다.
  • 그래서 특정 프로세스(서비스) 또는 기기에 접근하기 위해 포트 포워딩을 통해 외부 아이피 : 특정 포트로 접속하면 내부 아이피 : 특정 포트로 맵핑해준다.
  • 포트 포워딩은 외부 아이피 : 포트번호와 내부 아이피 : 포트번호를 연결해주는 기능이다.

 

포트 포워딩은 인터넷에서의 접속 가능성을 높이기 위해 사용된다 

포트 포워딩은 인터넷을 통해 연결된 라우터, 통칭 공유기를 사용할 때 일반적으로 사용된다 라우터는 인터넷에 연결된 모든 장치들의 데이터 통신을 관리하는데 각각의 장치는 라우터에게 IP 주소를 부여 받는다

하지만, 일부 장치들은 인터넷에 직접 연결되어 있지 않기 때문에 외부 인터넷에서 해당 장치로의 접속이 불가능. 이런 경우에 포트 포워딩을 사용하여 해당 장치로의 접속을 가능하게 할 수 있다.

집에서 내부 네트워크에 연결된 NAS(Network Attached Storage) 장치가 있다고 가정해보면, 이 장치에 대한 외부 인터넷에서의 접속은 불가능. 하지만, NAS 장치는 라우터에 연결되어 있기 때문에 라우터를 통해 외부 인터넷에서 NAS 장치로의 접속을 가능하게 할 수 있다 이때, 라우터의 설정에서 포트 포워딩을 통해 외부 인터넷에서 접속 가능한 포트 번호를 설정해주면, 해당 포트 번호로 접속하는 모든 데이터가 NAS 장치로 전달되도록 설정할 수 있습니다.

즉, 외부와 통신 연결하기 위한 안전한 연결과정이라고 보면 된다.

출처=https://velog.io/@dha/%ED%8F%AC%ED%8A%B8-%ED%8F%AC%EC%9B%8C%EB%94%A9-%EC%99%9C-%ED%95%98%EB%8A%94-%EA%B1%B8%EA%B9%8C

'DB > DB 필요한 지식' 카테고리의 다른 글

SQL 인젝션이란?  (0) 2023.04.09
클라이언트와 서버  (0) 2023.04.08
Primary key,foreign key 비교와 그 외의 key들  (0) 2023.03.17

+ Recent posts