온라인코딩부트캠프 63

Security CORS 설정

사이드 프로젝트를 진행 중 프론트 담당자로부터 CORS를 열어달라는 요청이 들어왔다. 1. CORS(Cross Origin Resource Sharing) - Origin 의 위치가 다를 때 자원을 주고받을 수 있도록 하는 http 통신 프로토콜. - 프로토콜(https)+호스트(ip주소)+포트번호(8080) 의 조합 - 클라이언트와 서버의 Origin 이 다를 때 CSRF와 XSS 등에 취약하다 때문에 / 특정 경로 / http 메서드 / 특정 해더 / 포트 에 대해 접근을 허용할 수 있다. 2. CORS 설정 방법 CORS를 허용하는 방법에는 크게 두 가지가 있다. 1. CorsFilter를 구현하여 Spring Security에서 관리하는 방법2. SpringFramwark 가 제공하는 MVC 기능..

Spring 2024.03.17

Mappstruct 사용

Mappstruct를 적용하여 사용하여 보았다. 여러 Entity와 DTO 계층의 자동 매핑을 위해 모든 Entity를 대상으로 하는 인터페이스를 두었다 build.gradle //mapstruct implementation 'org.mapstruct:mapstruct:1.5.5.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' EntityMapper public interface EntityMapper{ //제네릭 타입으로 DTO와 Entity를 받는다. //단일 Entity -> result D toDto(final E entity); //list 형식 Entity -> result List toDtoList(fina..

Spring 2024.03.11

쇼핑몰 프로젝트 VM 배포

서버 원격 접속 : GitBash를 통하여 엘리스 트랙에서 제공한 VM 주소로 원격 접속 ssh {아이디}@{배포용 VM IP} //이후 패스워드 입력 JVM 설치 : 프로젝트에서 open jdk 21 버전을 쓰고 있어 URL 주소를 통해 수동 다운로드 해주었다 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.deb ->> sudo apt install ./jdk-21_linux-x64_bin.deb node.js 설치: 프론트는 Vue로 구현할 예정임으로 node를 다운로드하였다. 로컬의 node버전과 일치하지 않을 수 있어 차후 다시 버전을 맞춰줘야 할 수도 있을 것 같다. sudo apt update sudo apt inst..

AWS 2024.03.11

SpringSecurity 인증 방식

세션/쿠키 기반 인증과 토큰 기반 인증 세션/쿠키 기반 인증 플로우 사용자가 로그인을 시도하면 서버 사용자의 인증 정보를 검증 인증이 성공하면, 서버에서 해당 사용자의 세션을 생성하고 세션 ID를 발급 발급된 세션 ID는 쿠키에 저장되어 사용자의 브라우저로 전송 사용자가 다음 요청을 할 때, 브라우저는 쿠키에 저장된 세션 ID를 서버에 함께 전송 서버는 세션 ID를 확인하여 사용자를 식별 토큰 기반 인증 플로우 사용자가 로그인을 시도하면, 서버는 사용자의 인증 정보를 검증 인증이 성공하면, 서버는 사용자의 정보와 권한을 포함하는 토큰(JWT 등)을 생성하고 사용자에게 전송 사용자는 토큰을 저장하고, 이후의 모든 요청에 토큰을 포함시켜 서버에 전송 서버는 요청받은 토큰을 검증하여 사용자를 인증 장단점 비교..

Spring 2024.03.02

SpringSecurity 인증

SecurityContextHolder - SecurityContext 가 세팅되면, 현재 인증된 사용자로 부터 정보를 사용할 수 있다. - 직접 세팅 or 자동 세팅(UserDetail ,UserDetailService) - SecurityContext 객체를 ThreadLocal 로 저장(쓰레드별 동시성 보장). - FilterChainProxy에 의해 초기화가 보장 SecurityContext - 현재 인증된 사용자의 Authentication 을 포함 Authentication - 인증된 정보가 포함됨 - principal: 식별된 사용자 정보 - credentials: 보통 password 이며, 대부분의 경우 노출 방지를 위해 인증된 후 초기화 - authorities: 인가된 권한 인증 객체..

Spring 2024.03.01

SpringSecurity 아키텍쳐이해하기

Spring Security 란 Spring Security는 접근제어, 인증, 인가의 기능을 수행한다. 이 기능을 수행할 때 아래와 같은 절차로 시행된다. 인증(Authentication): 사용자가 시스템에 접근하려 할 때 그들의 신원을 확인하는 과정. 인가(Authorization): 인증된 사용자가 특정 자원이나 데이터에 접근하거나 특정 작업을 수행할 수 있는 권한을 부여받는 과정 사용자의 역할, 접근 정책, 권한 등에 따라 결정됨. 감사(Auditing): 접근 시도와 실제 접근에 대한 기록을 유지하는 과정. 보안 위반 시도를 추적 및 시스템의 보안 상태를 평가 Spring Security는 Servlet 모듈과 WebFlux 각각에 대한 모듈을 나누어 제공한다. - Servlet 기반(Spri..

Spring 2024.02.24

N+1 문제 해결(JPA)

프로젝트 API에 성능향상을 위한 JpaReopsitory 메서드 튜닝을 넣어보았다. 기존 상황: 기존 JpaRepository에서는 기본으로 제공하는findById를 통해 단건 조회를 해오고 있었던 상황 조회 쿼리문 단건 조회에 2개의 쿼리가 나가는 상황(댓글) 현상황은 1개의 댓글밖에 없어 1개의 추가 조회 쿼리가 나가지만 만약 N개의 댓글이 조회한다면 N개를 추가 쿼리 해오는 문제가 생긴다. 이 상황을 N+1 문제라고 부른다. @Query("select distinct p from Project p join fetch p.projectReplies where p.id = :projectId") Project findByIdFetchJoin(Integer projectId); @Query 어노테이션으..

Spring 2024.02.12

N+1 해결 (QueryDSL)

프로젝트 QueryDSL 적용기 사이드 프로젝트에 필터 및 검색기능을 추가해달라는 요청이 있었다. 기존 페이지네이션으로 결과 값을 주고 있던 API에 QueryDSL로 검색 필터를 적용하였다. 요청 사항: DB에 대한 검색 기능 키워 programmingjun.tistory.com 프로젝트에 QueryDSL을 적용하여 동적 쿼리를 통한 조회 기능을 추가하였다. 하지만 하나의 조회 쿼리에 필요 이상의 join 쿼리가 나갔었다. 이를 해결하기 위해 fetch Join을 적용하였다. fetch join 적용 public Page searchProjectByPage(ProjectSearchCond cond, Pageable pageable) { String keyword = cond.getKeyword(); I..

Spring 2024.02.11