XSS(Cross Site Scripting) 공격이란 XSS(Cross Site Scripting) 공격 사이트 간 스크립팅(또는 크로스 사이트 스크립팅, 영문 명칭 cross-site scripting, 영문 약어 XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를..
문제 상황 이전에 낙관적 락을 이용하여 동시성 이슈를 해결하려고 했습니다. 저희 서비스는 낙관적 락을 이용하면 데드락(Deadlock)이 발생합니다. 그리고 여러 계정이 동시 요청이 왔을 때 성능 저하가 뚜렷합니다. 해결 방법 Like 엔티티 동시성 이슈 해결 Like 엔티티에 유니크 제약 조건을 걸어 Like 엔티티에 값이 중복되어 들어가는 것을 방지하겠습니다. LikeEntity @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(uniqueConstraints = { @UniqueConstraint( name = "user_board_post_unique", columnNames = { "user_id", "board_post_id"..
배경게시글 좋아요 로직에 문제가 발생했습니다. 텀을 두고 좋아요를 눌렀을 때 좋아요, 좋아요 취소에는 전혀 문제가 발생하지 않습니다. 동시에 많은 작업이 있을 때 동시성 문제가 발생합니다.좋아요 개수 문제, LikeEntity 중복값 저장 2가지 문제에 대해 다루겠습니다.제가 처음 작성한 로직은 게시글 좋아요 버튼을 누르면 Like Entity save 메서드가 실행이 되고, Like Entity에 값이 존재하면 delete가 되는 로직입니다. 원인 분석 먼저 하겠습니다.원인 분석MySQL 8.0 (innoDB)이며, 트랜잭션 격리 레벨은 디폴트값인 Repeatable Read입니다.게시글A를 찾는 SELECT 과정은 Lock을 얻는 과정이 발생하지 않기 때문에 두 트랜잭션 모두 같은 게시글A에 접근합니..
배경 개인 SNS 프로젝트에서 글쓰기 기능과 함께 사진을 여러장 올릴 수 있는 상황입니다. 이미지 첨부X 먼저 이미지 없이 작성했을 때 걸리는 시간과 발생하는 쿼리에 대해 보겠습니다. 이미지 첨부O 사진을 약 8장을 첨부해서 같이 올린다고 가정하겠습니다. 프로젝트 규모 자체가 작고, 서버에 이미지를 업로드 하는 프로젝트지만 이런 사소한 부분 하나하나 고쳐나가고 효율적으로 짜고 싶어서 작성했습니다. 환경 Java 17 Spring 6.0.11 (Spring Boot 3.1.2) Gradle 8.2.1 Junit 5.9.3, Mockito 5.3.1 JWT 현재 로직 분석 먼저 글쓰기에 대한 로직을 간단하게 보겠습니다. @Transactional public PostCreateResponseDto creat..
배경 토큰 방식의 인증은 두 가지 방법으로 나뉩니다. 1. Access Token만을 이용하는 방식 2. Refresh Token과 Acces Token을 같이 이용하는 방식 왜 2번 방식이 더 선호되는지, Refresh Token을 어디에 저장하고 어떤 방식으로 저장할 것인지 작성하겠습니다. 제가 하고있는 토이 프로젝트(간단한 SNS를 구현 중)에 적용한 코드입니다. 환경 Java 17 Spring 6.0.11 (Spring Boot 3.1.2) Gradle 8.2.1 Junit 5.9.3, Mockito 5.3.1 JWT Redis Refresh Token의 필요성 Access Token 만료시간을 짧게 하면 보안성은 좋아집니다. 그러나, Access Token의 만료시간을 짧게 가져가면 사이트를 이..
문제가 발생한 Controller UserControllerTest 그냥 봤을 때 전혀 문제 없이 진행할 수 있는 테스트입니다. User 관련한 Test 코드를 실행했을 때 상황을 보겠습니다. 유저 관련 Test만 진행했을 때 전혀 문제없이 통과합니다. 순서를 어떻게 해도 통과합니다. 단순 회원가입 기능만 작성했기 때문에 그렇게 꼬일 일이 없습니다. 그럼 전체 테스트를 돌려봤을 때 상황을 살펴보겠습니다. 전체 테스트 돌렸을 때 발생한 문제 UserControllerTest만 실패 다른 테스트는 리팩토링 과정 중에 아직 수정하지 않고 UserTest 쪽 먼저 진행 중에 글을 작성한 것입니다. 신경쓰지 않아도 됩니다. 대체 왜 UserControllerTest가 실패했을까요? 처음 이 문제를 해결하기 위해서..