저는 macOS Ventura intel칩 버전입니다!

 

1. os에 맞게 다운로드해주세요.

https://www.docker.com/

 

Docker: Accelerated, Containerized Application Development

Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

2. 더블 클릭해서 실행 후 응용프로그램 디렉토리로 옮겨줍니다.

3. 터미널에서 설치 확인 가능합니다.

docker -v

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

Spring Elk 연동  (0) 2022.11.17
ELK 설치  (0) 2022.11.16
docker redis 설치  (0) 2021.02.17
Http를 통한 양방향 통신  (0) 2021.02.16
Http 통신과 Socket 통신  (0) 2021.02.16

CORS(Cross-Origin Resource Sharing)

교차 출처 리소스 공유

 

Origin

예를 들어

https://www.imsseeong.tistory.com:443/manage/newpost/?type=post#foo

protocol host port path query string fragment
https:// www.imsseong.tistory.com :443 /manage/newpost ?type=post #foo

Origin(출처)는 protocol, host, port 까지 합한 것을 의미

 

SOP(Same-Origin Policy)

같은 출처에서만 리소스를 공유할 수 있다는 규칙을 가진 정책

예외적으로 CORS 정책을 지킨 리소스 요청은 허용

 

같은 출처와 다른 출처를 구분하는 법

URL의 구성 요소 중 scheme, host, port가 동일하면 같은 출처

예를 들어 

https://www.imsseeong.tistory.com:443 가 동일해야 한다.

 

CORS 동작

웹 클라이언트 어플리케이션이 다른 출처의 리소스를 요청할 때는 HTTP 프로토콜을 사용하여 요청을 보낸다.

이때 요청 헤더에 Origin 이라는 필드에 요청을 보내는 출처를 담는다.

Origin: https://www.imsseeong.tistory.com:443

이후 서버가 요청에 대한 응답을 할 때 응답 헤더의 Access-Control-Allow-Origin 값에 이 리소스에 접근 허용된 출처를 내려준다.

응답을 받은 브라우저는 자신이 보냈던 요청의 Origin과 서버가 보내준 응답의 Access-Control-Allow-Origin을 비교한 후

이 응답이 유효한 응답인지 아닌지를 결정한다.

 

1. Preflight Request 

본 요청을 보내기 전 예비 요청을 Preflight라고 부른다.

예비 요청에서는 HTTP 메소드 중 OPTIONS 메소드가 사용된다.]

Access-Control-Request-Headers Content-Type Access-Control-Request-Method

출처: https://evan-moon.github.io/2020/05/21/about-cors/

 

2. Simple Request

Preflight와 전반적인 로직은 같지만, 예비 요청이 존재하지 않음

특정 조건을 만족하는 경우에만 예비 요청을 생략할 수 있다.

  • 요청의 메소드는 GET, HEAD, POST
  • Accept, Accept-Language, Content-Language, Content-Type, DPR, Downlink, Save-Data, Viewport-Width, Width를 제외한 헤더를 사용하면 안됨
  • 만약 Content-Type를 사용하는 경우에는 application/x-www-form-urlencoded, multipart/form-data, text/plain만 허용

 

3. Credentialed Request

인증된 요청을 사용하는 방법

인증과 관련된 정보를 담을 수 있게 해주는 옵션이 credentials

옵션 설명
same-origin(기본값) 같은 출처 간 요청에만 인증 정보를 담을 수 있다.
include 모든 요청에 인증 정보를 담을 수 있다.
omit 모든 요청에 인증 정보를 담지 않는다.

요청에 인증 정보가 담겨있는 상태에서 다른 출처의 리소스를 요청하게 되면 다음 두가지 검사 필요

  • Access-Control-Allow-Origin에는 * 사용 금지
  • 응답 헤더에는 반드시 Access-Control-Allow-Credentials: true 존재

 

@CrossOrigin

Spring에서 CORS를 적용할 수 있게 만드는 어노테이션

도메인을 설정하면 해당 도메인은 다른 Origin이지만 요청을 주고받을 수 있게 된다.

해당 API controller 상단에 추가해 주자

@CrossOrigin(origins = "http://localhost:8080")
@CrossOrigin(origins = {"http://localhost:8080", "https://imsseong.tistory.com"})

/usr/lib/jvm/java-1.11.0-openjdk-amd64/conf/security

 

vi java.security

 

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ include jdk.disabled.namedCurves

 

 

Remove TLSv1 and/or TLSv1.1

docker pull redis

 

docker images

 

docker network create redis-net

 

docker network ls

 

docker run --name redis-container -p 6379:6379 redis

 

docker start redis-container

 

docker exec -it redis-container /bin/bash

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

ELK 설치  (0) 2022.11.16
mac에 docker 설치  (0) 2022.11.16
Http를 통한 양방향 통신  (0) 2021.02.16
Http 통신과 Socket 통신  (0) 2021.02.16
P2P  (0) 2021.02.10

Http

클라이언트가 서버에 요청을 보내고 응답을 받으면 연결이 끊긴다.

서버-클라이언트의 실시간 상호 작용이 불가능하다.

 

=> 실시간 상호 작용을 위한 기술이 필요

 

1. Polling

클라이언트가 서버로 http request를 계속 보낸다.

서버에 이벤트가 없어도 계속 요청을 보내기 때문에 서버와 클라이언트의 부담 급증 

 

2.  Long Polling

클라이언트가 서버로 http requestf를 일단 보낸다.

서버에서 해당 클라이언트로 전달한 이벤트가 생기면 응답 메시지 전달 후 연결 종료

클라이언트는 다시 새로운 request를 보낸다.

 

3. Streaming

클라이언트가 서버에 requst를 보낸다.

연결이 끊기지 않은 상태로 끊임없이 데이터를 받는다.

하지만 클라이언트가 서버로 요청을 보내기가 힘들다.

 

4. WebSocket

Http기반으로 하면서 Http의 문제 해결이 목표

송신과 수신을 동시에 처리할 수 있으며 socket connection 을 유지하기 때문에 양방향 통신과 데이터 전송이 가능하다.

기존의 TCP socket과 다른 점은 

WebSocket은 최초 접속이 일반 http 요청을 이용한 handshaking으로 이루어진다.

또한 TCP socket은 바이트 스트림을 사용하지만

웹소켓을 통해 전달되는 텍스트는 UTF-8 포맷을 가진다.

 

  • Stateful : 클라이언트와 한번 연결이 되면 계속 같은 라인 사용해 통신하기 때문에 HTTP사용시 필요없이 발생되는 HTTP와 TCP연결 트래픽을 피할 수 있다(웹소켓은 HTTP와 달리 최초 접속을 제외하고 헤더정보를 보내지 않기에 네트워크 비용측면에서 이득)
  • HTTP 요청을 그대로 사용하기에 기존 80(HTTP포트), 443(HTTPS)포트로 접속하므로 추가 방화벽을 열지 않아도 되고 HTTP의 규격인 CORS적용이나 인증등의 과정을 기존과 동일하게 가져갈 수 있다.

기본적으로 웹소켓API(자바크립트)는 간단한 기능만 제공하기에 대부분의 경우 socket.io같은 오픈 소스 라이브러리를 많이 사용한다.

SockJS(http://sockjs.org)

springframework에서 WebSocket을 지원한다. 스프링 메뉴얼에 webSocket 부분을 보면 위와 같은 브라우저 문제를 해결하기 위한 방법으로 SockJS를 솔루션으로 제시한다. 역시 자체 스팩으로 webScoket 미지원 브라우저를 관리한다. 서버개발시 스프링 설정에서 일반 webSocket 으로 통신할지 SockJS 호환으로 통신할지 결정할 수 있다. 클라이언트쪽은SockJS client를 통해 서버와 통신한다.



출처: https://adrenal.tistory.com/20 [시나몬 브레드]

 

WebSocket은 HTTP와 TCP의 특성을 섞어 놓은 프로토콜이며

결국 핵심은 웹 브라우저 환경에서 연결지향 통신하기 위한 기술이라는 점이다.

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

mac에 docker 설치  (0) 2022.11.16
docker redis 설치  (0) 2021.02.17
Http 통신과 Socket 통신  (0) 2021.02.16
P2P  (0) 2021.02.10
@value 어노테이션 사용시 기본값  (0) 2021.01.25

1. Http 통신

Client의 요청(Request)이 있을 때만 서버가 응답(Response)하여 해당 정보를 전송하고 곧바로 연결을 종료하는 방식

 

  • Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신이다.

  • Server로부터 응답을 받은 후에는 연결이 바로 종료된다. 

  • 실시간 연결이 아니고, 필요한 경우에만 Server로 요청을 보내는 상황에 유용하다.

 

2. Socket 통신

Server와 Client가 특정 Port를 통해 실시간으로 양방향 통신을 하는 방식

 

  • Server와 Client가 계속 연결을 유지하는 양방향 통신이다.
  • Server와 Client가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용된다.

  • 실시간 동영상 Streaming이나 온라인 게임 등과 같은 경우에 자주 사용된다.

 

 

 

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

docker redis 설치  (0) 2021.02.17
Http를 통한 양방향 통신  (0) 2021.02.16
P2P  (0) 2021.02.10
@value 어노테이션 사용시 기본값  (0) 2021.01.25
@Transaction 사용 시 내부 메소드 간의 호출  (0) 2020.12.31

P2P (peer-to-peer network)

동등 계층간 통신망

 

클라이언트나 서버라는 개념 없이, 오로지 동등한 계층 노드들이 서로 클라이언트와 서버 역할을 동시에 하게 된다.

중앙 서버를 통신하는 형태의 클라이언트-서버 모델과는 구별된다.

멀티미디어 파일을 공유하는 용도는 매우 보편적

spring boot

common properties 사용 시

모든 프로젝트에 추가하거나

@value 어노테이션 사용 시 기본값을 적어줘야 합니다.

 

예를 들면

@Value("${mine.test:default value}")
private String test;

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

Http 통신과 Socket 통신  (0) 2021.02.16
P2P  (0) 2021.02.10
@Transaction 사용 시 내부 메소드 간의 호출  (0) 2020.12.31
스케줄 기능 사용하기  (0) 2020.11.30
@Transactional  (0) 2020.06.11

+ Recent posts