전체 글196 Spring Security 적용 이후 API 계층 테스트 방법에 대한 생각 Spring Security를 적용하고 API계층을 테스트하기가 한층 어려워졌다. Spring Security 프레임워크를 사용하기 시작하는 시점부터, API 계층은 해당 라이브러리와 아주 강하게 결합된다. Security 설정을 어느 정도 마치고 테스트에 적용하니, 내가 작성한 Configuration 파일이 적용되지 않았다. 예를 들어, 사용자의 인증 정보가 필요하지 않은 메서드에도 @WithAnonymousUser가 적용되지 않거나, disable한 csrf를 요구했다. 내가 생각한데로 진행이 되지 않아 답답했다. 아마 이렇게 된 이유는 @WebMvcTest를 이용하여 단위 테스트 형태로 테스트 코드를 작성한 탓이라 생각되어 @SpringBootTest로 바꾸고 테스트를 진행해보니 내가 생각한 데로.. 2023. 12. 5. Spring Security를 사용할 때 csrf.disable()을 사용해도 되는 이유 - 토큰 사용 / 그래서 토큰은 어떻게 저장할건가? Spring Security는 기본적으로 csrf 공격에 대한 방어 기능을 제공한다. csrf가 뭐길래 방어 기능까지 제공할까? 사이트 간 요청 위조(Cross-site request forgery, CSRF)는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다. - 위키백과 그러니까, 나는 A라는 행동을 하기 싫은데, 강제로 A라는 행동을 취하게 되는 것이다. 예를 들어, 흔히 만나는 스팸 메일의 링크를 누르면 타인의 계좌에 송금되는 경우가 csrf의 예시라고 생각할 수 있겠다. 링크에 송금 링크를 걸어두고, 링크를 클릭하면 송금이 일어나게 되는 것이다. 송금 서비스는 송금 요청이 왔으니 이를 .. 2023. 12. 5. 08. 프록시와 연관관계 관리 프록시 엔티티를 조회할 때 연관 엔티티들이 항상 사용되는 것은 아니다. 예를 들어, 회원 엔티티와 연관된 바버샵 엔티티는 사용될 때도 있지만 그렇지 않을 때도 있다. 같은 회원 엔티티지만 바버는 연관된 바버샵 엔티티를 사용해 근무 중인 바버샵을 표시한다. 그러나 고객은 바버샵 엔티티와 연관관계 설정이 되어있지 않기 때문에 제공하지 않는다. public class Member extends BaseEntity { ... @ManyToOne @JoinColumn(name = "WORK_PLACE_ID") private BarberShop workPlace; 그런데 매번 회원 엔티티를 조회할 때마다 바버샵 테이블과 조인하는 것은 효율적이지 않다. JPA에서는 이런 문제를 해결하기 위해 엔티티가 실제로 사용될 .. 2023. 12. 5. Pull Request 020. 회원 가입 및 로그인 기능 TDD로 구현하기 - 회원 가입 Service 계층 구현 어떤 순서로 기능을 구현해야 할까를 고민하다가, 어짜피 이후 기능할 구현에 모두 로그인 로직이 연관되어있을 것이라 생각해 로그인 기능을 먼저 구현하고자 했다. 그런데 로그인을 하려면 회원이 있어야 한다. 그렇다, 로그인 구현을 위해서는 회원 가입을 먼저 구현해야한다는 것이다. 먼저 회원 가입부터 구현해보자. 회원 가입 로직은 다음과 같다. MemberController#postMember(dto) 메서드를 통해 회원 가입 요청을 받는다. 이 때 urn은 "/member"로 설정하며, MemberService#postMember(dto)로 반환받은 Response DTO를 ResponseEntity객체로 감싸 반환한다. MemberService#postMember(dto)는 비밀번호 암호화, 권한 설정 등.. 2023. 12. 4. PasswordEncoder의 작동 원리와 테스트하기 어려운 이유 회원 가입 과정에서 비밀번호의 암호화가 잘 되었는지를 테스트하고자 했는데, 지속적으로 실패했다. 내 생각은 다음과 같았다. '과정 전부 거치고 나온 Response DTO의 비밀번호랑 따로 PasswordEncoder로 인코딩한 비밀번호가 같은지를 검증하면 되지 않을까?' 뭐 꽤 괜찮은 생각이라고 생각했다. PasswordEncoder는 BCrype 그런데, 막상 진행해보니까 잘 되지를 않더라. 그래서 한 번, 같은 패스워드를 두 번 돌려서 결과를 확인해봤다. @Test void test(){ PasswordEncoder passwordEncoder1 = PasswordEncoderFactories.createDelegatingPasswordEncoder(); String password = "1234".. 2023. 12. 4. Pull Request 019. 페이징 처리 시 페이지 정보도 Response에 함께 담아주기 기존의 페이징 처리에서 문제점은 페이지 정보가 담기지 않는다는 점이었다. 엔티티 정보는 전부 담기지만, 해당 페이지가 몇 번째 페이지인지, 페이지에는 몇 개의 요소가 있는지, 전체 데이터는 몇 개이고 전체 페이지는 몇 페이진지의 정보가 담기지 않았다. 이렇게 페이징 처리가 진행되면 데이터는 넘어가지만, 실질적인 페이징 처리는 프론트엔드 단에 맡겨야한다. 심지어 이 과정 역시 프론트엔드 단에서 전체 데이터 갯수를 알고 있어야 가능하다. 여러 면에서 문제가 존재한다. 따라서 서버 레벨에서 페이지 정보도 함께 담아줘야만이 진정한 의미로 페이징 처리를 끝냈다고 볼 수 있다. @GetMapping public ResponseEntity getFreeBoardPage(@RequestParam(name = "page.. 2023. 12. 1. 이전 1 ··· 5 6 7 8 9 10 11 ··· 33 다음 반응형