프로그래밍 기초 36

CORS란 (Origin, SOP, CORS, CSP)

들어가기 전에... 교차 출저 리소스 공유(Cross Origin Resource Sharing, CORS)를 알기 위해서는 동일 출처 정책(Same Origin Policy, SOP)과 출처(Origin)가 무엇인지에 대한 지식이 있어야 합니다. 따라서 이번 포스팅에서는 순차적으로 Origin이 무엇인지 배우고 SOP가 무엇인지 배운 뒤 CORS에 대해 배워보겠습니다. Origin 출처(Origin)는 CORS와 SOP의 O에 해당하는 Origin을 뜻합니다. 이는 URL의 프로토콜(스킴이라고도 함), 도메인, 포트로 정의 됩니다. 두 객체의 프로토콜, 호스트, 포트가 모두 일치하는 경우 같은 출처라고 말합니다. http://example.com:80/app1/index.html 위와 같은 URL이 있..

실시간 통신 - WebSocket이란

실시간 통신의 필요성 유저들은 더 빠르고 반응성 있는 웹 애플리케이션과 서비스를 기대합니다. 예를 들어 실시간 채팅 애플리케이션이나 주식 시장 모니터링, 실시간 위치 추적 및 멀티플레이어 게임과 실시간 협업 툴 등이 그러합니다. 우리는 HTTP 프로토콜을 사용하여 이러한 실시간 통신과 비슷한 것을 이룰 수 있습니다. 물론 완벽하지는 못하지만요. 이번 포스팅에서는 기존 HTTP 기술을 활용하여 이러한 실시간 통신과 비슷한 경험을 달성하는 기술과 해당 기술의 단점을 보완하는 WebSocket에 대해 배워보겠습니다. HTTP를 사용한 실시간 통신의 구현 HTTP를 사용한 실시간 통신은 크게 Polling, Long Polling, Streaming 이 세 가지로 나눌 수 있습니다. 어떻게 HTTP를 사용하여 ..

트랜잭션의 격리성과 격리 수준

개인적으로 공부한 내용을 기반으로 작성하였습니다. 잘못된 내용을 반견하신 경우, 댓글로 알려주시면 감사하겠습니다. 이전 글의 트랜잭션 ACID 속성으로부터 파생된 내용입니다. 트랜잭션 격리성 트랜잭션은 종종 동시에 실행됩니다. 여러 트랜잭션이 동시에 수행되더라도 각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 격리되어 수행되어야 합니다. 즉, 한 트랜잭션의 작업이 다른 트랜잭션에 영향을 주지 않고 서로 격리되어 실행되어야 한다는 의미입니다. 이러한 Isolation 성질을 보장하지 않으면 데이터의 일관성과 무결성이 깨질 수 있습니다. 예를 들어, 각각 50원씩 들어있는 계좌 X, Y가 있을 때, X에서 Y로 30원을 입금하는 트랜잭션 1과 Y에서 X로 30원을 입금하는 트랜잭션 2가 격리성을 ..

데이터베이스 트랜잭션

개인적으로 공부한 내용을 기반으로 작성하였습니다. 잘못된 내용을 반견하신 경우, 댓글로 알려주시면 감사하겠습니다. 트랜잭션(Transaction) 트랜잭션은 DBMS 내에서 데이터베이스에 대해 수행되는 작업 단위입니다. 트랜잭션은 하나 이상의 데이터베이스 조작 작업을 하나의 논리적인 작업 단위로 묶어 관리합니다. 아래에 트랜잭션의 필요성을 느낄 수 있는 예시가 있습니다. A 사용자가 B 사용자의 계좌에 500원을 이체하는 메서드: A 사용자의 계좌에서 500원을 출금합니다. // 1 B 사용자의 계좌에 500원을 입금합니다. // 2 위와 같이 A 사용자가 B 사용자의 계좌에 500원을 이체하는 메서드가 있다고 생각해 봅시다. 해당 메서드는 1) A의 계좌에서 500원을 출금하고, 2) B 사용자의 계좌..

마이크로서비스 아키텍처(MSA, Microservice Architecture)

마이크로서비스 아키텍처(MSA, Microservice Architecture)란 마이크로서비스 아키텍처(MSA, Microservice Architecture)는 소프트웨어 개발 기법입니다. 모든 아키텍처는 기존에 존재하는 어떠한 문제를 해결하기 위해 만들어집니다. 이에 근거하여 마이크로서비스 아키텍처 또한, 어떠한 문제를 해결하기 위해 만들어진 아키텍처입니다. 마이크로서비스 아키텍처는 흔히 모놀리식 아키텍처(Monolithic Architecture)의 문제를 해결하기 위해 사용됩니다. 따라서, 마이크로서비스 아키텍처를 알아보기 위해 이 글에서는 1)모놀리식 아키텍처가 무엇인지 알아보고, 2)마이크로 서비스 아키텍처를 알아본 뒤, 3)각각의 장단점을 비교하는 시간을 갖겠습니다. 모놀리식 아키텍처(Mo..

콘텐츠 보안 정책(Content Security Policy, CSP)

콘텐츠 보안 정책(Content Security Policy, CSP) Content Security Policy(CSP)는 웹 애플리케이션의 보안 강화를 위한 보안 정책 매커니즘입니다. CSP를 사용하면 웹 페이지의 리소스 로딩 및 실행에 대한 제한을 설정하여 악성 스크립트 실행을 방지하고 XSS(Cross-Site Scripting) 및 기타 웹 공격을 예방할 수 있습니다. CSP는 비유를 통해 설명하자면, 웹 애플리케이션의 보안 경계를 구축하는 방벽이라고 할 수 있습니다. 이 방벽은 웹 페이지에 허용되는 리소스와 동작을 제한하고, 악성 요소의 침입을 방지합니다. 특정 사람들에게만 통행을 허용하는 보안 게이트나 출입 제한 장치라고 생각해도 좋습니다. CSP는 허용되지 않은 스크립트 실행을 막고, 허용..

윈도 시스템, X 윈도 시스템, Xvfb

윈도 시스템, X 윈도 시스템, Xvfb 윈도 시스템, X 윈도 시스템, Xvfb는 모두 GUI(그래픽 사용자 인터페이스) 애플리케이션을 실행하고 조작하는 데 사용됩니다. 해당 글에서는 이 셋의 의미와 차이에 대해 알아볼 것입니다. 윈도 시스템 윈도 시스템은 사용자가 그래픽적인 방식으로 애플리케이션을 실행하고 조작할 수 있도록 합니다. 일반적으로 윈도 시스템은 창 관리자(Window Manager)라는 소프트웨어를 통해 창의 생성, 위치 조정, 크기 조정, 닫기 등을 관리합니다. 또한, 윈도 시스템은 입력 장치(마우스, 키보드 등)와 출력 장치(모니터)를 사용하여 사용자와 애플리케이션 간의 상호작용을 담당합니다. 윈도 시스템은 우리가 키보드를 누르거나 마우스를 움직이면 컴퓨터가 그것을 알아챌 수 있게 도..

Docker Compose

도커 컴포즈 도커는 애플리케이션을 격리된 환경인 "컨테이너" 안에 패키징하여 실행하는 기술입니다. 여러 개의 "컨테이너"를 함께 실행하고 관리하는 것은 번거롭고 복잡합니다. 이때 Docker Compose를 사용하면 여러 개의 컨테이너를 하나의 그룹으로 묶어 관리할 수 있습니다. 간단하게 말하면, Docker Compose는 여러 개의 "컨테이너"로 구성된 애플리케이션을 쉽게 실행하고 관리하기 위한 도구입니다. Docker Compose를 사용하여 개발자는 복잡한 컨테이너 관리 작업을 간소화하고 여러 개의 컨테이너로 구성된 애플리케이션을 다른 환경으로 쉽게 이동하거나 공유할 수 있어 개발과 배포의 효율성을 높일 수 있습니다. mysql과 node 서버를 각 컨테이너에 구동시키는 Docker compose..

깃허브 액션

깃허브 액션(Github Actions) Github Actions은 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 툴입니다. Github Actions의 구성요소 Github Actions는 EVENTS, WORKFLOWS, RUNNERS, JOBS, ACTIONS 다섯가지 구성요소로 구성됩니다. 풀 요청이 열리거나 이슈가 생성되는 등 리포지토리에서 어떠한 events가 발생할 때 실행되도록(트리거되도록) workflow를 구성할 수 있습니다. workflow에는 순차적으로 혹은 병렬로 실행할 수 있는 하나 이상의 job이 포함되어 있습니다. 각 job은 자체 가상 머신 runner 또는 컨테이너 내부에서 실행되며 정의한 스크립트를 실행하거나 workflow를 단순화할 수 있는 재사용..

CI/CD

CI/CD CI와 CD는 각각 지속적 통합(Continuous Integration, CI)과 지속적 전달/배포(Continuous Delivery/Continuous Deployment, CD)를 뜻합니다. 지속적 통합 지속적 통합은 가능한 자주, 빈번하게 코드의 변경 사항을 레파지토리에 머지해야 한다는 생각으로부터 출발합니다. "빈번하게" 변경 사항을 머지해야 하는 이유는 다음과 같습니다. 긴 시간에 걸쳐 여러 개발자가 레파지토리에 머지하지 않고 개인의 로컬 PC에서 개발을 진행하는 상황을 상상해 보십시오. 그들이 레파지토리에 그들의 변경 사항을 머지할 때 레파지토리에 저장된 코드와 각 개인이 머지하려는 코드는 많이 달라져 있을 것이고, 따라서 변경된 코드 간 충돌이 넓은 범위에서 많이 발생할 가능성..