3월 13, 2024

http 와 https의 차이점 (구별법/ 좌물쇠모양/ 주의요함 표시/포트번호)

1. HTTP와 HTTPS의 차이점

URL 주소를 보면 http로 시작하는 것도 있는 반면 https로 시작하는 것도 있어 차이가 궁금한 사람들이 있을 수 있다.

URL(Uniform Resource Locator)은 네트워크 상에서 자원이 어디 있는지를 알려주는 것이기 때문에 단순히 웹사이트 주소라는 우리의 인식보다 훨씬 더 포괄적인 개념이라고 할 수 있다.

 

http, https의 개념을 하나씩 살펴보면서 둘의 차이점이 무엇인지 알아보겠다.

 

1. HTTP: HyperText Transfer Protocol

 

HTTP는 약자가 의미하는 것처럼 인터넷에서 HyperText를 Transfer (전송)하기 위해 사용되는 Protocol (통신규약)이라고 할 수 있다. HyperText에서 알 수 있듯이 HTTP는 정보를 텍스트로 주고 받게 된다. 이러한 부분이 HTTP의 가장 큰 취약점이라고 할 수 있다. 텍스트로 주고 받는 것이기 때문에 네트워크에서 전송 신호를 가로채면 데이터 유출이 발생할 수 있다는 것이 가장 큰 약점이다. 

 

HTTP의 공식 port는 80번 포트이다. 80번 포트는 웹사이트를 위한 표준 포트로, 웹사이트가 TCP 80 포트를 통해 연결하면 서버가 이에 응답하면서 정보를 전송하는 방식인 것이다. 위에서 언급된 것처럼 데이터 유출이 발생할 수 있는 보안 문제를 해결하기 위해서 우리는 HTTPS를 사용한다.


 

2. HTTPS: HyperText Transfer Protocol Secure Socket

 

HTTPS는 약자에서 볼 수 있듯이 HTTP 뒤에 S(Secure socket)가 하나 더 붙은 프로토콜이다. 데이터를 주고 받는 과정에서 데이터 유출이 발생할 수 있는 HTTP의 약점을 보완하기 위해서 서버와 클라이언트 사이의 통신 시에 통신 내용을 암호화한다는 특징을 가지고 있다. HTTPS의 포트 번호는 443번이다. 

 

요즘은 개인정보에 민감하기 때문에 개인정보를 다루는 사이트의 경우 대부분 HTTPS의 사용을 권장하고 있다. 네이버, 구글 같은 경우도 모두 https를 사용하고 있다는 것을 알 수 있을 것이다.


 

그렇다면 http와 https는 어떻게 구분할 수 있을까?



https로 시작하는 웹사이트 예시

쉽게 그림상으로 구별이 가능하다. https로 시작하는 경우 위와 같이 자물쇠 모양의 그림이 있고 자물쇠를 클릭해보면 위의 글씨처럼 '이 사이트는 보안 연결(HTTPS)이 사용되었습니다' 라고 뜬다. 

 

 

반면 똑같은 웹사이트를 http로 접속해보면,



http로 접속했을 경우

위와 같이 [주의 요함]이라는 표시가 뜨는 것을 알 수 있다. 그리고 주의 요함을 클릭해보면 '이 사이트는 보안 연결 (HTTPS)이 사용되지 않았습니다'라고 표시가 뜬다. 이런 것을 통해서 우리는 사이트의 URL이 http로 시작되고 있는지, https로 시작되고 있는지를 쉽게 알 수 있다. 


2. ssl 인증

만약 본인이 사이트를 제작하는 입장이라면, 그리고 해당 사이트가 개인정보를 다루고 있다면 https로 시작하는 사이트를 만드는 것이 무조건 좋다. https로 시작하는 사이트를 만들기 위해서는 ssl 인증을 받으면 되는데 방법은,

https://www.programmingstory.com/2024/02/ssl-https.html

해당 포스팅에서 다루었으니 궁금한 사람은 클릭해서 ssl 인증서를 받도록 해보자. 


12월 28, 2023

Java HTTP Request 사용법 (.http) + String으로 readLine해보기

우리가 흔히 사용하는 HTTP protocol의 요청이 어떻게 들어오는지를 위해 Java Spring을 사용하여 간단 코드를 작성해보았다. 


public void start() throws IOException {
try (ServerSocket serverSocket = new ServerSocket(port)) {
logger.info("1. Custom WAS started {} port.", port);

Socket clientSocket;
logger.info("2. Custom WAS waiting for the client.");

while ((clientSocket = serverSocket.accept()) != null) {
logger.info("3. Custom WAS client connected.");


try (InputStream in = clientSocket.getInputStream(); OutputStream out = clientSocket.getOutputStream()) {
BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
DataOutputStream dataOutputStream = new DataOutputStream(out);

String line;
while ((line = br.readLine()) != "") {
System.out.println(line);
}
}
}
}
}
그 다음으로는 Java project 최상단 우클릭 => New => HTTP Request를 클릭하여 
.http 확장자의 파일을 하나 만들어준다. 이렇게 .http를 사용하면 우리가 흔히 요청을 날릴 때 사용하는 Postman을 대체할 수 있고, Intellij에서 지원을 해주기 때문에 git으로도 버전 관리가 가능하다는 장점이 있다. 

그런 다음에  이렇게 8080 포트로 get 요청을 하나 보내준다. 

테스트 하기 위해서는 Java main class를 먼저 실행해 준 뒤, 생성한 .http 파일을 이후에 클릭해주면 자연스레 get 요청을 보내주는 것이다.


이렇게 하면 



client를 기다리다가 http 요청이 들어가 이후 client가 connected 되었다는 것을 알 수 있다. 

그 다음 들어오는 http request header를 읽기 위해서 BufferedReader를 사용하였고, 
BufferedReader를 통해 string으로 readLine() 을 할 수 있다. 

그 결과로 다음과 같은 String이 출력되는 것을 알 수 있다. 


GET 으로 HTTP/1.1 요청이 들어갔고 
Host 정보, Connection 정보, User-Agent, Accept-Encoding 정보가 Request 정보에 담겨있다는 것을 알 수 있다. 

이런 식으로 HTTP 정보를 읽어보았으니 이를 custom하여 
customized Tomcat을 구현해볼 수 있다.