Programming134 [12/6 TIS] @AuthenticationPrincipal 사용기 - null 해결법 사실 저 애너테이션을 너무너무 써보고 싶었다. 부트캠프에서 프로젝트를 진행할 때부터, 저 애너테이션으로 사용자 정보를 한 번에 가져올 수 있다면 얼마나 좋을까 생각했다. 왜? 나는 안되니까... 정말 많은 글들에서 Spring Security를 적용하면 해당 애너테이션을 통해 사용자 정보를 가져올 수 있다고 한다. 그런데 내가 하면 안됐다. 정확히는 넘어와야 할 객체가 항상 null이었다. 오늘은 이 문제를 해결하고 직접 사용해보자. @PostMapping public ResponseEntity postFreeBoard(@AuthenticationPrincipal Member writer, @RequestBody FreeBoardDto.Post dto) { FreeBoardDto.Response resp.. 2023. 12. 6. Pull Request 021. 로그인 기능 TDD로 구현하기 - Spring Security / JWT 적용하기 인증 / 인가 처리를 위해 선택할 수 있는 방법은 다양하다. 모든 필터 레벨에서 일어나는 일을 직접 처리할 수도 있고, OACC같은 프레임워크를 사용할 수도 있다. 인증을 위해 쿠키를 이용하거나 세션을 이용할 수도 있다. 나는 Spring Security 프레임워크를 활용해 로그인 과정을 처리하고, 인증에 사용되는 정보를 JWT를 이용해 클라이언트와 소통하기로 결정했다. Spring Security는 기본적으로 Spring의 하위 프레임워크다. 따라서 Spring 기반의 프로젝트에서 호환성이 좋아 쉽게 사용 가능하다. JWT를 사용하는 이유는 쿠키 - 세션이 지닌 문제점 때문이다. 쿠키는 보안에 지나치게 취약하고, 세션은 서버에 부하가 많이 걸린다. 관련해서 쉽게 설명해준 영상이 있으니 보고 오면 좋다... 2023. 12. 6. Spring Security의 인증 처리 흐름 Spring Security를 구현하고 사용하는데, 어떻게 인증이 진행되는지 모르고 코드만 따라치는 건 아무 의미가 없다. 어떻게 로그인이 되는지 정도는 간단하게 알고 가는 것이 기왕 공부하는 의미가 있지 않을까? 일반적인 클라이언트 - 서버 간 소통은 클라이언트가 뭔가 요청을 쏴주면 서버에서 해당 요청을 받고 이에 맞는 적절한 작업을 통해 응답하는 과정이다. 그런데 인증 / 인가가 추가되면 어떨까? 서버는 클라이언트의 모든 요청을 그냥 받고 수행해서 결과물을 반납할까? 그럼 인증 / 인가의 의미가 없지 않을까? 그럼, 나한테 요청을 보낸 사용자를 인증하는 과정은 어디서 일어나야할까? 해당 과정은 서버가 요청을 받아들이고 일련의 업무를 수행하기 전에 처리되어야 한다. 그러니까 클라이언트 - 서버의 일대일.. 2023. 12. 6. 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. 이전 1 ··· 5 6 7 8 9 10 11 ··· 27 다음 반응형