본문 바로가기
반응형

개발/Spring71

[Spring Security] Custom Login 만들기 Spring Security를 적용하고 따로 설정을 하지 않으면 자체적으로 제공하는 Login Form을 사용한다. 하지만 대부분의 서비스는 서비스에 알맞는 Login Form을 사용하고 싶어한다. Custom Login Page를 어떻게 제작하는지 간단하게 살펴보겠다. 순서는 아래와 같이 크게 3가지로 나뉜다. SecurityConfig 등록 formLogin설정 변경 logout설정 등록 1. SecurityConfig등록 SecurityConfig를 등록해준다. http.formLogin().loginPage(사용할 페이지) 로 설정해준다. 이때 주의할점이 .permitAll()을 꼭 설정해줘야한다. 로그인을 해야하는데 권한이 없어서 들어가지 못하는 상황이 발생할 수 있다. 로그인페이지를 커스텀하게.. 2020. 7. 12.
[Spring] Security를 적용한채로 TEST 해보기 기존에 돌아가던 Test로직에 Spring Security를 입혀보기!! 모든 서비스에는 기본적으로 보안이 들어가야한다. 그래서 Spring Security를 적용해보기로 했다. 아래에는 잘 돌아가던 회원가입 테스트로직이다. 이제 Security를 추가해보자! @Test @DisplayName("회원가입 성공 테스트") void register() throws Exception { MemberDTO memberDTO = MemberDTO.builder() .userId("test") .password("123qwe") .email("test@naver.com") .certification("N") .build(); Set roles = new HashSet(); roles.add(UserRole.USER.. 2020. 6. 28.
[Spring] css파일을 못찾을때 필자는 화면을 만들기 위해 css파일과 html을 만들었다. 그런데 때로는 Failed to load resource: the server responded with a status of 404 () 오류와 because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. 위와 같은 오류로 css파일을 못찾았다. 원인은 간단하다. 경로를 잘못 적어주었기 때문이다. 아래와 같이 경로를 /css/..... 로 적어주면 정상적으로 불러와준다 2020. 5. 16.
[Spring Security] 초기 설정시 403 error가 날때 회원가입을 위한 비밀번호 암호화 기능을 찾다가 간편하게 사용할 수 있는 BCryptPasswordEncoder가 있어서 Security를 알아보게 되었다. SecurityConfig에 모든 요청을 허용하게 설정했다. 나의 예상대로라면 모든 요청을 허용했으니 어떤 요청이던 패스가 되어야한다. /api/users 에 접근하는 테스트코드를 작성하였다. SecurityConfig에는 /api 의 하위에 있는 모든 요청은 허가 되었기때문에 status코드가 200이 떨어져야한다. 하지만 결과는 예상과 다르게 403(권한없음)이 떨어졌다. 이유는 Security를 기본으로 설정하게되면 csrf 설정을 해줘야하기 때문이다. (csrf가 뭔지는 google을 검색해보자) 필자는 가벼운 예제사이트를 만드는것이므로 csr.. 2020. 5. 16.
[Spring] 값 검증을 위한 어노테이션 @Valid 필자는 웹사이트를 구축하다가 회원가입을 할때 클라이언트에서 검증해서 넘긴다지만 신뢰성의 문제로 다시 한번 서버에서 검증을 진행하려고 하였다. 이때 파라미터가 1~2개면 상관이없는데 8~9개되면 if문이 8~9개나 들어가게된다. 그래서 무엇이 있을까 알아보다가 @Valid라는 어노테이션이 있다는걸 알게되었다. @Valid를 사용하면 파라미터 바인딩이될때 설정한대로 값검증을 실행하고 문제가 없는경우에만 로직을 수행한다. 사용방법을 알아보기전에 필자의 로직에 대해 설명하겠다. 1. UserDTO를 통해 회원가입에 필요한 정보를 받아올 것이다. 2. 이때 UserDTO를 @Valid로 검증할것이다 3. 올바르게 가져왔다면 User 객체로 ModelMapper를 사용하여 변환해줄것이다. 4. 문제가 없다면 상태코.. 2020. 5. 15.
[Spring data JPA] Auditing으로 생성일/수정일 간편하게 생성하기! 개인프로젝트에서는 생성일/수정일을 몰라도 크게 상관없겠지만 실무에서는 생성일/수정일을 필수로 가지고 있어야 하는경우가 많다. 언제 생성됐는지, 언제 변경되었는지는 거의 모든 테이블에 있어야한다. 추가로 생성을 누가했고 수정은 누가했는지도 필요한 테이블도 있다. 이 경우에 모든 Entity에 생성일필드와 수정일 필드가 공통적으로 들어간다. 이러한 공통적인것을 추상클래스를 이용하여 설정하는 방법이 있다. 바로 Auditing이다. 사용법은 아래와 같다. BaseEntity를 다음과 같이 설정한다. @EntityListeners 어노테이션을 사용하여 Auditing기능을 추가한다. 그리고 생성일/수정일을 사용할 Entity에서 BaseEntity를 상속받는다. 이렇게 하면 끝!!이면 좋겠지만 실행하는곳에서 @.. 2020. 5. 10.
[회원가입] 회원가입 이메일 인증 구현 Build.gradle 파일에 dependencies 부분에 추가 해줍니다. 이메일 인증을 받기 위해서 이메일을 적고 인증번호를 보낼 수 있는 버튼과 인증번호를 입력하고 알맞는 값을 입력하였는지 확인할 버튼을 생성해야한다. 이메일을 보내는 부분 이메일을 보내는 버튼을 눌렀을 때 동작하는 function입니다. isEmail function을 이용하여 이메일 형식인지 검사합니다. (select 방식으로 바꾸셔도 됩니다. 필자는 귀찮아서 정규식으로 검사했습니다.) api를 호출하여 성공적으로 보냈으면 아무메세지를 안띄웠습니다. 원하시는 메세지를 출력하시거나 알려주시면 됩니다. 실패시에는 오류, 잠시 후 재시도라는 메세지를 띄웠습니다. 호출을 받는 Controller 부분입니다. 세션을 얻어오고 입력한 ema.. 2020. 4. 4.
[Spring] java.lang.RuntimeException: Could not invoke method: .. defined in class ... so no params were used. Test 코드를 작성하는데 아래와 같은 오류가 발생했다. 필자는 paramsForTestFree 메소드를 작성한 이후에 발생하여 paramsForTestFree메소드만 주구장창 봤는데 발생원인은 따로있었다... 원인은 이부분이었다. 이상한것을 알겠는가? 아래와같이 public을 붙여주면 정상적으로 동작한다..... 2020. 3. 30.
[Spring] API 설계시 주의사항 Return type을 Entity로 하면 안된다. DTO로 변환을 해서 반환을 해야한다. 이유 1. 내부설계가 노출된다. 2. Entity가 변하게 될경우 API 스펙이 바뀌므로 API를 호출하는측 소스도 바뀌어야한다. 2020. 3. 27.
[Spring] 비밀번호 암호화 실제 서비스에서는 비밀번호와 같이 치명적일 수 있는 데이터는 암호화해서 저장해야한다. 비밀번호를 예제로 암호화에 대해서 알아보도록 하겠다. 생각해야 할 로직은 크게 아래 두 가지로 나눌 수 있다. 1. 가입할 때 비밀번호 암호화 2. 로그인할 때 매칭하는 방법 바로 예제를 보도록 하겠다. 비밀번호 암호화를 도와줄 무언가가 필요하다. 필자는 Spring Security에서 제공해주는 BCryptPasswordEncoder를 사용해서 진행할 것이다. 사용할 BCryptPasswordEncoder를 빈으로 등록을 해준다. 암호화를 할 Class에서 @Autowired를 통해서 주입받는다. 실제 DB에 Insert하는 부분에서 BCryptPasswordEncoder가 제공해주는 encode를 통해서 암호화를 진.. 2020. 3. 27.
[Spring]class java.lang.String cannot be cast to class org.springframework.security.core.userdetails.User 필자는 User타입을 쓰다가 UserDetails 타입으로 변환을하였으나 해결방법은 동일하다고 생각하여 글을 남깁니다. Spring Security + JWT를 적용하다가 어이없는 실수였지만 혹시나 필자와같은 실수를 하는분들께 도움이 되고자 글을 남겨본다. 우선 필자는 authenticate에서 Token에 user.getUsername()을 보냈고 Success Handler에서 값을 받아서 사용하려고 하는 도중에 class java.lang.String cannot be cast to class org.springframework.security.core.userdetails.User 이러한 오류가 났다. String타입을 User타입으로 변환하지 못한다는 오류인데 왜 나는지 찾지 못했었다. 원인은 .. 2020. 3. 15.
[Spring] Spring boot란 무엇인가 ? Spring Boot란 무엇인가 제품수준의 Spring 기반 Application을 만들때 도와준다. 개발자가 일일히 정의하지않아도 가장 널리 사용된다고 생각되는 설정(Spring 플랫폼뿐만 아니라 제3의 라이브러리까지)을 기본적으로 제공해준다. 목표 - 모든 Spring 개발을 할때 더 빠르고 폭넓은 사용성을 제공해준다. - 일일히 설정하지 않아도 설정되어져있는것들을 기본으로 제공해준다. 그러나 개발자가 쉽고 빠르게 원하는대로 바꿀 수 있다. - non-functional features 제공 (ex.. security, embedded servers 등) - 더이상 XML설정과 code generation을 하지않는다. 참고 : https://docs.spring.io/spring-boot/docs/.. 2020. 3. 4.