1. Proxy
프록시를 말 그대로 번역하면 대리라는 뜻을 가진다.
프록시(Proxy)는 대개로 '네트워크 환경에서 클라이언트와 서버 사이에서 중계 역할을 하는 시스템이나 소프트웨어'를 말한다. 하지만 프록시가 꼭 중계 서버의 의미만을 가지는 것은 아니다. 객체지향 프로그래밍에서 하나의 객체가 다른 객체의 요청을 대신 처리 할 때도 프록시라는 말을 사용한다.(AOP와 관련된 기능 구현이나 의존성 주입, 트랜잭션 관리를 하게 되는 경우)
@Service
public class UserService {
@Transactional
public void performTransaction() {
// 비즈니스 로직 실행
}
}
@Entity
public class User {
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
오늘은 프록시 서버에 대해서만 정리해보려고 한다.
프록시 서버를 사용하는 이유는 다음과 같다.
1. 익명성 제공 : 사용자의 IP 주소를 숨기고 프록시 서버의 IP 주소를 대신 사용하여 익명성을 강화함
2. 캐싱 : 자주 요청되는 데이터를 저장하여 다음 요청 시 더 빠르게 응답함
3. 보안 강화 : 트래픽을 모니터링하고 불필요하거나 악의적인 요청을 차단하여 보안을 강화함
4. 우회 : 지리적 제한이나 특정 콘텐츠에 대한 접근 제한을 우회할 수 있도록 도와줌(VPN과 비슷하지만 같은 것은 X, 밑에서 더 다룰 예정)
5. 접근 제어 : 특정 웹사이트나 서비스를 차단하거나 사용자 활동을 관리함
프록시는 보안 강화의 목적이 가장 크지만, 일반적으로 개발자들이 API 테스트를 하거나 네트워크 문제를 디버깅 할 때도 사용된다.
2. VPN
VPN(Virtual Private Network)의 사전적 의미는 '가상 사설 네트워크'이며 네트워크 상의 의미는 '공용 네트워크를 사용하여 데이터를 암호화하고 안전하게 전송할 수 있도록 해주는 기술'이다.
데이터를 암호화해서 전송한다는 점에서 위에서 말한 Proxy서버와 차이점을 가진다.
VPN의 특징
1. 암호화 : 데이터를 VPN 클라이언트에서 암호화된 상태로 VPN 서버로 전송
2. 가상 터널 : 클라이언트와 서버 간에 외부로부터 격리된 가상 터널을 형성하여 데이터를 안전하게 전송
3. 익명성 : 사용자의 IP 주소가 VPN 서버의 IP 주소로 대체됨
4. 보안 : 공용 Wi-Fi 환경에서도 데이터를 암호화하여 안전하게 보호
5. 원격 접속 : 사용자는 원격지에서도 회사나 사설 네트워크에 접속하여 내부 리소스에 접근 가능
6. 지역 제한 우회 : VPN은 다른 국가의 서버를 통해 접속하므로, 지역 제한된 콘텐츠에 접근할 수 있음
VPN의 용도
- 민감한 정보 전송 시 안전성 확보
- 사용자의 IP 주소와 위치를 숨겨 익명성을 강화, ISP(인터넷 서비스 제공자)나 정부의 트래픽 모니터링 방지
- 회사 네트워크에 원격으로 안전하게 접속하여 내부 시스템 및 리소스에 접근
- 넷플릭스, 유튜브, 온라인 게임 등 지역 제한 콘텐츠에 접근
- 검열 우회(ex: 특정 국가에서 차단된 웹사이트에 접속하는 경우)
- 파일 전송 시 IP를 숨기고 암호화하여 보안성 향상
3. HTTP
HTTP(HyperText Transfer Protocol)란 웹 상에서 클라이언트와 서버 간에 데이터를 주고받기 위한 프로토콜이며 하이퍼텍스트 문서(HTML), 이미지, 동영상 등 다양한 리소스를 전송하기 위한 표준을 말한다.
HTTP의 특징
- 비연결성 : 서버는 클라이언트 요청을 처리한 후 연결을 끊고 이후 요청이 오면 새로운 연결을 만든다.(이를 보완하기 위해 HTTP/1.1부터 지속 연결 기능이 도입됨)
- 상태 비저장성 : HTTP는 요청 간에 상태를 유지하지 않기 때문에, 클라이언트가 상태를 유지하려면 쿠키(Cookie), 세션(Session) 등을 사용해야 한다.
- 유연성 : 다양한 데이터 형식(HTML, JSON, XML 등)을 전송할 수 있다.
- TCP/IP 기반 : HTTP는 주로 TCP/IP 프로토콜(인터넷에서 데이터를 주고받기 위한 규칙이며 TCP는 데이터를 안전하게 전달하고, IP는 데이터를 올바른 주소로 보내는 역할을 수행함) 위에서 동작하며, 요청-응답 구조로 데이터를 주고받는다.
HTTP의 요청 방식
1. Request(클라이언트가 서버에 특정 작업을 요청)
- 요청 메시지에는 요청 라인(요청 메소드, URL, HTTP 버전), Header(인증 정보, 콘텐츠 타입와 같은 부가 정보), Body(전송할 데이터)가 포함된다.
2. Response(서버가 요청을 처리하고 결과를 반환)
- 응답 메시지에는 상태코드(200, 404, 500과 같은 요청 처리 결과), Header(캐시 제어, 콘텐츠 길이와 같은 응답 관련 정보), Body(HTML, JSON과 같은 요청한 데이터)가 포함된다.
HTTP 메소드
HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청, 응답에 대한 데이터 전송 방식을 말한다. 메소드의 종류로는 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, CONNECT, TRACE가 있으며 이 중에 자주 사용되는 메소드는 GET, POST, PUT, PATCH, DELETE 메소드이다.
HTTP 응답코드
HTTP 응답코드로는 1XX번대부터 5XX번대까지 있지만 자주보게 되는 응답코드는 2XX(요청에 대한 응답을 성공적으로 반환함)번, 4XX(클라이언트 측에서 잘못된 요청을 한 경우)번, 5XX(서버 측에서 요청을 처리하는 과정 중에 문제가 발생한 경우)가 있다.
4. HTTPS
HTTPS(HyperText Transfer Protocol Secure)란 HTTP에 SSL/TLS(웹 브라우저와 서버 간의 데이터를 몰래 보거나 조작하지 못하게 보호)암호화 기술을 추가한 프로토콜을 말한다.
HTTPS의 특징
- 데이터 암호화 : 평문(Plain Text)이 아닌 암호화된 데이터가 전송되므로, 외부에서 내용을 볼 수 없음
- 데이터 무결성 보장 : 데이터를 전송하는 중간에 위변조되지 않았음을 보장하며 데이터가 변경되거나 손상되면 이를 탐지할 수 있음
- 인증 : SSL/TLS 인증서를 사용해 서버가 신뢰할 수 있는 기관(CA, Certificate Authority)에 의해 인증되었음을 증명함
- 기존 HTTP와 호환 : HTTPS는 기존 HTTP 프로토콜을 기반으로 동작하므로, HTTP와 대부분의 기능이 동일함
- 포트 번호 : 기본적으로 443번 포트를 사용함
HTTPS의 동작 방식(SSL/TLS 핸드셰이크 과정을 통해 암호화된 통신을 설정)
1. 클라이언트가 서버에 연결 요청 : 사용자가 HTTPS URL로 접속하면, 브라우저가 서버에 연결 요청을 보냄
2. 서버 인증서 제공 : 서버의 공개키와 인증 정보가 포함된 SSL/TLS 인증서를 클라이언트에 보냄
3. 인증서 검증 : 클라이언트는 인증서의 유효성을 확인하고 암호화된 세션 키를 생성
4. 세션 키 교환 : 클라이언트는 공개 키로 세션 키를 암호화해 서버로 전송하고 서버는 자신의 개인 키로 이를 복호화하여 세션 키를 얻음
5. 암호화된 데이터 전송 : 클라이언트와 서버는 세션 키를 사용해 데이터를 암호화하고 안전하게 통신
5. PHP 그리고 싱글쿼터(') / 더블쿼터(")
PHP(Hypertext Preprocessor)는 C언어 기반 서버 사이드 스크립트 언어로 동적 웹 페이지와 웹 애플리케이션을 개발하는 데 사용된다. Hypertext Preprocessor라는 이름은 HTML과 같은 정적 콘텐츠에 동적인 기능을 추가할 수 있다는 점을 강조한다.
싱글쿼터(')와 더블쿼터(")는 PHP에서 문자열을 정의할 때 사용되는데, 각각 처리 방식에 있어서 차이가 있고 시큐어 코딩에 있어 중요하기 때문에 정리를 해두려고 한다.
싱클쿼터(')는 문자열 내부에 있는 모든 내용을 그대로 출력하며 변수나 이스케이프 시퀀스는 동작하지 않는다.(단, \와 '\는 예외)
$var = "world";
echo 'Hello $var'; // 출력: Hello $var
echo 'It\'s PHP!'; // 출력: It's PHP!
더블쿼터(")는 문자열 내부에 있는 변수나 이스케이프 시퀀스를 해석하여 처리하며 변수를 문자열에 포함하거나, 줄바꿈(\n)과 같은 특수 문자를 사용할 수 있다.
$var = "world";
echo "Hello $var"; // 출력: Hello world
echo "Line 1\nLine 2"; // 출력: Line 1 (줄 바꿈) Line 2
위와 같은 차이점이 있기 때문에 SQL 쿼리를 작성 시 변수 삽입이 가능한 더블쿼터 사용을 조심해야 한다. 사용자의 입력 값이 쿼리에 그대로 포함되면, 공격자가 SQL 인젝션 공격을 시도할 수도 있기 때문이다.
// 취약한 코드 (더블쿼터 사용)
$user_input = "1' OR '1'='1";
$sql = "SELECT * FROM users WHERE id = '$user_input'";
// 결과: SELECT * FROM users WHERE id = '1' OR '1'='1'; (SQL 인젝션 발생)
// 개선된 코드 (싱글쿼터 사용)
$sql = 'SELECT * FROM users WHERE id = \'' . addslashes($user_input) . '\'';
뿐만 아니라 더블쿼터는 변수를 해석하기 때문에, 사용자 입력을 변수로 직접 포함하는 경우 문제가 발생할 수 있다. 따라서, 변수 해석이 필요 없는 경우 싱글쿼터를 사용하고 더블쿼터를 사용할 때는 반드시 입력 검증 및 이스케이프 처리를 통해 보안을 강화해야 한다.
6. URL Encoding, Decoding
URL Encoding
URL Encoding이란 URL에서 사용 불가능한 문자나 특수 문자를 인코딩(변환)하여 안전하게 전송할 수 있도록 만드는 과정을 말한다.
이는 공백, 특수 문자, 비영문 알파벳 등의 문자가 URL 문법 규칙에 있어서 문제가 될 수 있기 때문이다.
인코딩 방식은 간단하다. 허용되지 않는 문자가 있다면, % 기호 뒤에 해당 문자의 ASCII 값(16진수)를 붙여 표현하면 된다.
예)
- 공백: %20
- 슬래시(/): %2F
- 콜론(:): %3A
허용되는 문자 : 알파벳, 숫자, 일부 특수 문자( - , _ , . , ~ )
허용되지 않는 문자 : 공백, 제어 문자(줄바꿈, 탭 등), 특수 문자(<, >, #, %, {, }, |, \, ^, ~, [, ], `, ", ')
Encoding 예시
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrlEncodingExample {
public static void main(String[] args) {
try {
// 검색어
String searchQuery = "Apple iPhone 16";
// URL 인코딩
String encodedQuery = URLEncoder.encode(searchQuery, "UTF-8");
// 쇼핑몰 검색 URL 생성
String url = "https://www.mnsoo.com/search?q=" + encodedQuery;
System.out.println("Encoded Search URL: " + url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
출력 결과 :
Encoded Search URL: https://www.mnsoo.com/search?q=Apple%20iPhone%2016
반대로, URL Decoding은 변환된 문자열을 원래의 문자로 복원하는 과정을 말한다.
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class UrlDecodingExample {
public static void main(String[] args) {
try {
// 인코딩된 검색어
String encodedQuery = "Apple%20iPhone%2016";
// 디코딩
String decodedQuery = URLDecoder.decode(encodedQuery, "UTF-8");
// 원래의 상품명 출력
System.out.println("Decoded Search Query: " + decodedQuery);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
출력 결과 :
Decoded Search Query: Apple iPhone 16
7. Client Side / Server Side
Client Side
클라이언트 사이드란 웹 애플리케이션에서 클라이언트, 즉 사용자의 웹 브라우저에서 실행되는 코드나 프로세스를 의미한다. 클라이언트 사이드에서는 HTML, CSS, JavaScript와 같은 기술을 사용하여 동적인 사용자 인터페이스(UI)를 구성하는 것 뿐만 아니라, JavaScript를 사용하여 클라이언트에서 직접 데이터를 처리하거나, 서버와의 비동기 통신(AJAX)을 통해 데이터를 받아올 수 있다.
Server Side
서버 사이드란 웹 애플리케이션에서 서버에서 실행되는 코드나 프로세스를 의미한다. 서버 사이드는 클라이언트가 보내는 요청(예: 페이지 요청, 폼 데이터 전송 등)을 처리하여 결과를 동적으로 생성하거나 데이터베이스에 접근하여 정보를 반환하는 역할을 수행한다.
클라이언트와 서버 사이드 모두 데이터를 처리할 수 있는 방법을 가지고 있지만 방식마다 장단점이 존재한다. 꼭 UI와 관련된 코드를 Client Side에서 실행하고 데이터와 관련된 코드만 Server Side에서 처리해야 하는 것이 아니다. 효율적이고 성능 좋은 서비스를 만들기 위해서는 각 사이드에서 어떤 데이터를 처리할 것인지 적절히 분배하는 것이 중요하다.
각 사이드에서 데이터를 처리할 때의 장단점 :
8. 상대 경로 / 절대 경로
상대 경로란 현재 위치를 기준으로 파일이나 디렉토리의 위치를 지정하는 방법이다. 상대 경로는 파일이나 디렉토리가 어디에 위치하든지 그 위치를 기준으로 다른 파일이나 디렉토리를 참조한다.
예시)
파일 시스템의 경우 : ../image.png
웹 개발의 경우 : <a href="about.html">About Me</a>
절대 경로란 파일 시스템의 루트 디렉토리부터 시작하여 파일이나 디렉토리의 위치를 지정하는 방법이다. 절대 경로는 파일이 시스템 내에서 어디에 위치하는지 상관없이 그 위치를 정확하게 지정한다.
예시)
파일 시스템의 경우 : /home/user/docs/file.html
웹 개발의 경우 : <a href="http://www.mnsoo.com/about.html">About Me</a>
특히 웹 개발을 할 때 절대 경로보다는 상대 경로를 작성하는 것이 선호된다. 그 이유는 절대 경로를 사용하면 로컬 시스템에서만 동작하거나 특정 서버에서만 동작할 수 있지만 상대 경로를 사용하면 파일 위치에 상관없이 동일하게 동작하므로 여러 환경에서 사용하기 더 좋기 때문이다. 또한, 코드의 재사용성과 유지 보수가 용이해지기 때문에 상대 경로를 더 많이 사용한다.
9. HTML / CSS / Javascript
HTML이란 웹 페이지의 구조를 정의하는 마크업 언어로, 웹 페이지에서 텍스트, 이미지, 비디오, 링크 등 다양한 콘텐츠를 구성하고 표시하는 데 사용된다.
HTML의 특징
- 태그 기반 : HTML은 태그를 사용하여 웹 페이지를 구성하며 각 태그는 웹 브라우저에 어떤 내용을 표시할지 지시한다.
- 링크 연결 : 하이퍼링크를 통해 다른 웹 페이지로 연결할 수 있다.
- 표준화 : HTML은 W3C(World Wide Web Consortium) 표준을 따르기 때문에 웹 페이지가 일관되게 동작하도록 한다.
- 다양한 미디어 : HTML은 이미지, 비디오, 오디오 파일 등 다양한 미디어를 삽입할 수 있다.
CSS란 Cascading Style Sheets의 약자로 HTML 문서의 스타일링(디자인)을 담당한다. HTML은 페이지의 구조를 정의하지만, CSS는 그 구조에 색상, 폰트, 배치 등을 적용하여 시각적으로 꾸미는 것을 도와준다.
Javascript란 웹 페이지에 동적인 기능을 추가하는 프로그래밍 언어이다. HTML과 CSS가 페이지의 구조와 스타일을 담당하는 반면, JavaScript는 페이지에서 일어나는 동적인 기능(클릭 이벤트 처리, 폼 유효성 검사, 애니메이션 효과 등)처리, 서버와의 통신, DOM을 통해 HTML 요소를 변경하고 조작하는 역할을 수행한다.
Javascript의 특징
- 클라이언트 사이드 언어 : 서버와의 상호작용 없이 페이지의 동적인 요소를 처리한다.
- 객체지향 및 함수형 언어
- 비동기 처리 : JavaScript는 비동기 프로그래밍을 지원하여, 사용자 인터페이스를 차단하지 않고 백그라운드에서 데이터를 처리할 수 있다.
- 동적 타이핑 : JavaScript는 변수에 타입을 명시하지 않고 사용하며, 타입이 동적으로 결정된다.
- 브라우저와 상호작용 : DOM API를 통해 HTML 요소를 실시간으로 수정하고 이벤트를 처리한다.
사람 몸에 비유해서 정리하자면, HTML은 뼈대, CSS는 피부, Javascript는 근육의 역할을 맡는다.
HTML과 Javascript의 호환성
HTML과 JavaScript는 웹 페이지의 동작을 함께 정의하고 처리하기 위해 설계되었다. HTML은 웹 페이지의 구조적 부분을, JavaScript는 동적 기능을 제공하여 둘 사이에서 자연스러운 호환성을 제공한다.
- DOM : JavaScript는 DOM(HTML 문서의 구조를 객체 모델로 표현한 것)을 통해 HTML 요소에 접근하고 이를 동적으로 수정한다.
- 이벤트 기반 처리 : JavaScript는 HTML 요소에 이벤트 리스너를 붙여 사용자의 상호작용(예: 클릭, 입력 등)에 반응하도록 한다.
'Security > Web Hacking' 카테고리의 다른 글
웹 해킹 기초 - 코드 리뷰 (0) | 2025.01.22 |
---|---|
웹해킹 기초 문제 풀이 - 1 (0) | 2025.01.22 |
전공 세미나 수업 - 해킹과 SQL 인젝션에 대하여 (0) | 2022.12.22 |
IP (0) | 2022.12.21 |
웹 보안 (0) | 2022.12.13 |