Web

Web

[Spring] CORS Configuration with Spring security

이전에 했던 프로젝트에서 작성했던 코드를 보고 제대로 정리하지 않았던 것 중 CORS 가 있었다. CORS ( Cross-Origin Resource Sharing ) 란? 서로 다른 도메인 간 통신을 할 때, 서로 다른 출처를 가지고있기 때문에 보안적인 측면에서 통신이 허용되지 않는다. 통신을 위해서는, 요청 헤더 Origin 필드에 요청 출처를 함께 담아 교차 출처 HTTP 요청을 실행해야 한다. 출처를 비교하는 로직은 서버에 구현된 스펙이 아닌 브라우저에 구현된 스펙 기준으로 처리되며 브라우저는 클라이언트의 요청 헤더와 서버의 응답 헤더를 비교해서 최종 응답을 결정한다. 두 개의 출처를 비교하는 방법은 URL 의 구성 요소 중 Protocol, Host, Port 이 세 가지가 동일한 지만 확인한다..

Web

[Spring] 동시성 이슈와 synchronized 에 관하여

재고 관리 로직을 통해 동시성 이슈에 대해서 정리해보자. 공유 자원과 임계 영역(Critical Section) 그리고 Race Condition 먼저, 스레드의 공유 자원에 대해 생각해보자. 스레드가 여럿일 경우 스레드는 힙 영역에 있는 모든 데이터를 공유한다. 힙에는 모든 객체와 객체의 속한 필드들이 저장되며 스레드에서 접근이 가능하다. 그렇다면 임계 영역(Critical Section)은 무엇일까 ? 이는, 공유 자원에 액세스하고 이에 대한 쓰기 작업을 수행하는 코드 세그먼트를 말한다. 예시는 아래와 같다. Item 클래스와 해당 클레스의 멤버 변수들은 힙에 할당된 공유 자원으로 모든 스레드에서 접근이 가능하고, 공유 자원의 값을 변경하는 코드 세그먼트를 보여준다. 마지막으로, Race Condit..

Web

[JPA] Dirty Checking 동작 방식 및 성능 개선

JPA 를 다시 공부하다가 변경감지를 내가 잘 이해하지 못했던 것 같아 정리해본다. Dirty Checking 동작 방식 JPA 의 영속성컨텍스트(Entitymanger)에는 1차 캐시와 쓰기 지연 SQL 저장소가 존재한다. 1차 캐시에는 id와 entity가 저장되고 쓰기 지연 저장소에는 쿼리가 쌓이는데 commit 하는 시점에 DB에 반영이 된다. 해서, 1차 캐시에 저장되어있는 엔티티를 수정하면 Dirty Checking(변경 감지) 으로 인해 쓰기 지연 저장소에 update 쿼리가 쌓이고 Transaction 이 끝나는 시점에 DB에 반영이 된다. 자바 코드로 commit이나 flush를 통해 커밋하는 게 아닌 테스트 시나리오 상에서 update 쿼리가 언제 호출되는지 보고싶어서 테스트 코드를 작..

Web

[Spring] Maven Scope 와 Gradle Configurations

project 를 하며 dependency scope 가 다른 것을 보고 한 번 정리해야겠다고 생각했다. gradle configurations 와 maven scope 를 각각 살펴보자. 종속성 관리 종속성 관리는 프로젝트를 할 때 필요에 따라 외부 라이브러리나 프레임워크를 사용하는데 Maven 혹은 Gradle 과 같은 빌드 도구가 이를 관리해주는 것을 말한다. 또한, 이를 빌드 수명 주기의 적절한 시점에 클래스 경로에 추가하는데 이 시점에 대한 정리를 해보려한다. Maven 은 pom.xml 에서, Gradle 은 build.gradle 에서 관리하며 예시는 아래와 같다. - Maven scope : runtime com.mysql mysql-connector-j runtime - Gradle Co..

Web

[Spring] compiletime 과 runtime 에 대해서

프로그램을 돌렸을 때 RuntimeError 가 발생하여 꺼지는 등, compile과 runtime 이 자주쓰이는 용어임에도 개념이 정리되어있지 않은 것 같아 이번에 정리해보려한다. Runtime 과 CompileTime Java 와 같은 고급 언어로 작성된 명령이나 소스 코드는 컴퓨터가 이해할 수 있도록 기계어로 변환되어야 한다. Compile Time 은 소스 코드가 컴파일러에 의해 기계어로 변환되는 시간으로 소스 코드는 .java에서 .class로의 바이트 코드로 변환된다. 이 시간 동안에 컴파일러가 코드의 구문 등을 확인한다. Runtime 은 프로그램이 실행되는 기간이며 일반적으로 컴파일 시간 이후에 발생한다. CompileTime Error Java를 기준으로 Java의 문법에 맞지 않게 작성..

Web

[Spring] XSS Prevention

이번에는 시큐어코딩을 하기위한 XSS 를 예방하는 코드에 대해서 정리를 할 것이다. XSS(Cross-site scripting) 란? XSS 는 웹 애플리케이션에서 많이 나타나는 취약점 중 하나로, 공격자가 신뢰할 수 있는 응용 프로그램이나 웹 사이트의 코드에 악성 실행 가능 스크립트를 삽입하는 공격이다. 공격자는 종종 사용자에게 악성 링크를 보내고 사용자가 링크를 클릭하도록 유도하여 XSS 공격을 시작한다. 앱이나 웹사이트에 적절한 데이터 삭제가 없는 경우 악성 링크는 공격자가 선택한 코드를 사용자 시스템에서 실행하고, 결과적으로 공격자는 사용자의 활성 세션 쿠키를 훔칠 수 있게 된다. - XSS 공격 유형 1. Reflected XSS : 악성 스크립트가 웹 애플리케이션에서 피해자의 브라우저로 반영..

Web

[Spring] Unit Tests with Mockito ( in Service Layer )

@SpringBootTest 말고 Mockito 를 사용하면 어떨까 ? Mockito 란? Mockito 는 테스트 목적으로 Mock 개체를 생성하도록 특별히 설계된 Mocking 프레임워크이다. Mocking은 단위 테스트 시 외부 종속성이 있는 경우 사용되는 프로세스로, 외부 종속성의 동작이나 상태가 아니라 테스트 중인 코드에 집중한다. 또한, 대상을 실제 개체가 아닌 Mock과 같은 모의(가짜) 개체로 대체한다. Mockito를 사용하면 Mock 개체의 기대치와 동작을 정의하여 테스트 중에 특정 시나리오를 시뮬레이션할 수 있게 된다. 이를 통해, Junit을 보완할 수 있다. 주요 장점은 아래와 같다. 1. No handwriting : 개발자들이 직접 Mock 코드를 구현할 필요가 없다. 2. A..

Web

[Spring] MapStruct 사용하기

사용자가 입력한 데이터가 담긴 DTO를 DB에 저장할 Entity로 바꾸기 위한, mapstruct 사용법에 대해 정리해보자. MapStruct 란 ? 프로젝트를 할 때, DTO 와 Entity 를 매핑해야하는 경우가 많은데 이러한 매핑 코드를 작성하는 것은 귀찮고 오류가 발생하기 쉽다. MapStruct 는 이를 자동화하여 작업을 단순화할 수 있게 한다. 자세한 내용은, 아래 공식 문서를 통해 확인할 수 있다. MapStruct – Java bean mappings, the easy way! Java bean mappings, the easy way! Get started Download mapstruct.org MapStruct 사용하기 1. dependency 추가 및 주의사항( Gradle ) d..

limnj
'Web' 카테고리의 글 목록 (3 Page)