
[Snacks 개발 일기] #9 Spring Security에서 cors 에러 해결하기
2022. 12. 23. 15:25
Project/Snacks
프론트엔드와 연결하는 작업을 시작하면서 드디어 만나게 되었다 cors..... 사실 본 프로젝트를 시작하기 전에 기본 기능만 닌자처럼 빠르게 구현해보고 부족한 점을 찾아서 본 프로젝트에서 보완하자는 의미의 '닌자 프로젝트' 를 진행하면서 cors 설정을 해두었기때문에 크게 걱정하지는 않았다 하지만 닌자 프로젝트는 spring security를 사용하지 않았지...... 닌자 프로젝트에서 다음과 같이 cors을 적용했다 하지만 spring security는 이와 같이 해서는 안되고 filter에 적용을 시켜야 한다는 것을 모르고 있었다 몰랐기에 이것 저것 정말 많이 시도해보았고 결국은 해냈다 스프링부트 2.4.0부터 AllowCredentials가 true일때는 AllowdOrigin에 *를 추가할 수 없..

[Snacks 개발 일기] #8 구글 로그인과 같은 이메일로 자체 로그인할 때 안되는 현상 해결하기
2022. 12. 23. 13:05
Project/Snacks
이전에 자체 로그인시 사용되는 이메일이, oauth2를 통해 로그인하는 구글 이메일과 같을때 다른 유저라고 생각하고 구현을 했었다 각각 테스트를 했을때는 정상적으로 작동이 되었지만, oauth2로 로그인된 이메일이 이미 db에 저장되어 있을때 회원가입은 정상적으로 되지만 로그인이 안되는 현상을 발견했다 oauth2 로그인과 자체 로그인은 provider로 구분하게 해놓았는데, 이부분에서는 구분이 안되니 여기서 문제가 생겼을 것이라 생각했다 하지만 UsernamePasswordAuthenticationToken은 이름에서도 알 수 있듯이 유저 아이디와, 비밀번호로만 생성이 가능했고, provider를 사용하기 위해서는 새롭게 custom을 해야하나? 아니면 이미 구현된 CustomUserDetails에서 ..

[Snacks 개발 일기] #7 자체 로그인과 구글 로그인 충돌 방지
2022. 12. 12. 17:58
Project/Snacks
구현을 계속 하다보니 이런 경우도 있지 않을까 싶었다 구글 로그인을 통해 회원가입을 했는데, 구글 이메일을 가지고 자체 회원가입을 하는 경우.....! ....대대적인 수정에 들어갔다 우선 AuthRepository에 findByEmailAndProvider을 구현하여, email과 provider을 통해 유저의 정보를 찾을 수 있게끔했다 1. 자체 회원가입을 할 때 DB의 provider컬럼에 local이 추가되도록 하였다 (구글 로그인은 이미 추가됨) 2. JWT에 넣어져 있는 유저의 이메일을 가지고 유저를 구분하려 했으나, 이제는 provider와 함께 구분해야하기에 claim에 provider를 추가하였다 3. accessToken을 재발급하는 /refresh에도 유저의 refresh 토큰에 있는..

[Snacks 개발 일기] #6 구글 로그인정보를 통해 JWT 토큰 발급하기
2022. 12. 12. 17:31
Project/Snacks
2022.12.02 - [Project/Snacks] - [Snacks 개발 일기] #4 구글 로그인 적용하기 [Snacks 개발 일기] #4 구글 로그인 적용하기 자체 로그인 및 회원가입 기능 구현을 완료하고 구글 로그인을 적용하게 되었다 들어가기 전에 변명부터 하자면.... 우리 서비스는 JWT를 통해 로그인이 필요한 페이지(각 유저의 대시보드 페이 dev-juelee.tistory.com 이어서 작성하자면 Oauth2로그인을 한 정보를 가지고 JWT 토큰을 만드는데 성공했다 하지만 이것이 맞는 로직인지는 모르겠다 SecurityConfig에 successHandler를 추가해주니, customOAuth2UserService에서 사용하던 사용자 정보인 Authentication 객체를 받아올 수 있었..

[Snacks 개발 일기] #5 테스트코드 MockMvc에 JWT 필터 적용하기
2022. 12. 8. 16:17
Project/Snacks
제목이 이게 맞는지 모르겠다 나도 어떻게 해결했는지 모르기 때문이다 우선 문제상황은 /auth관련하여 구현을 로컬 로그인 및 회원가입 기능 구현 -> 로컬 로그인 및 회원가입 테스트 코드 작성 -> JWT 발급 및 검증 기능 구현 -> OAuth2 로그인 기능 구현 이 순으로 하였다 OAuth2를 적용하는 과정에서 정말 많은 것이 바뀌게 되었고, 다 구현하고 나서 기존의 로컬 로그인 및 회원가입이 정상적으로 작동을 할 지 의문이었다 그래서 회원가입 테스트 코드를 돌려보니 기존에 잘 되었던 테스트코드가 400에러에 "JWT 토큰이 존재하지 않습니다." 이 로그를 내뿜고 있었다 이상해서 postman으로 회원가입을 테스트해보니 잘된다....? MockMvc가 필터가 적용이 안되는 것을 깨닫고 불꽃 구글링을 ..

[Snacks 개발 일기] #4 구글 로그인 적용하기
2022. 12. 2. 17:39
Project/Snacks
자체 로그인 및 회원가입 기능 구현을 완료하고 구글 로그인을 적용하게 되었다 들어가기 전에 변명부터 하자면.... 우리 서비스는 JWT를 통해 로그인이 필요한 페이지(각 유저의 대시보드 페이지)에 접근할 수 있다 구글 로그인을 도입하면서 많은 문제가 발생하게 되었다 원래 생각하던 로직은 Applicatioin과 Google Server간에 인증 코드를 요청하고, 인증 코드로 토큰을 요청하고, 그 토큰으로 API를 요청하는 것을 생각했다 하지만 스프링 시큐리티를 사용하면 기대했던 로직과는 다르게 그냥 바로 로그인 되어버린다 이 문제를 해결하기 위해 아직도 고군분투 중이다 (살려줘.....) 따라서 지금 작성하는 글은 그냥 스프링 시큐리티의 OAuth2 로그인을 어떻게 적용하였는가?에 대한 글이다 우선 구글..

[Snacks 개발 일기] #3 filter에 Response값 지정하기
2022. 11. 27. 19:23
Project/Snacks
그동안 프론트로부터 값이 들어오면 Controller -> Service에서 처리를 한 후 미리 만들어놓은 ResponseEntity에 원하는 응답 메시지를 작성하는 코드를 사용했었다 하지만 이번에는 조금 다르다 로그인을 하기위해 유저 이메일과 비밀번호의 값을 가지고 오면 바로 Controller에서 처리하는 것이 아니라 filter에서 처리를 하는 코드이다 따라서 다음과 같이 유저 이메일과 비밀번호의 값으로 만든 authenticationToken을 통해 authenticationManger의 authenticate에서 DB에 값으로 들어온 유저 이메일이 존재하는지, 그리고 그 비밀번호가 동일한지 확인해준다 만일 로그인에 유저 이메일이 존재하지 않거나, 비밀번호가 틀릴경우 BadCredentialsEx..

[42 Seoul] so_long
2022. 11. 17. 18:05
42 Seoul
설명에 들어가기 전 후기 본과정에 오고나서 처음으로 평가를 해본 과제여서 그런지 여러 그래픽 과제 중에서도 so long을 제일 하고 싶었다. 특히 원하는 캐릭터와 이미지를 가지고 간단한 게임을 만든다는 것이 흥미로웠다. 이 프로그램을 만들기 위해서 어떠한 과정을 거치고, 어떤 코드가 필요한 지 머리 속에 착착 그려져서 구현하는데는 어렵지 않았다. 다만 맵을 저장하는 과정에 있어 연결리스트로 맵을 저장하였는데, 연결리스트를 잘 다루지 못하여서 꼬박 하루가 넘게 연결리스트 저장에만 시간을 쏟았다. 이차원 배열을 가지고 구현했다는 동료의 말을 듣고, 이차원 배열로 갈아탈까 생각했지만 이미 연결리스트를 통해 구현한 터라 계속 진행하고 싶었다. 하지만 저장된 맵의 상하좌우를 다 검사하는 과정에서 연결리스트가 이..

[Snacks 개발 일기] #2 ResponseEntity 적용하기
2022. 11. 17. 14:29
Project/Snacks
회원가입 API를 구현 완료하고 로그인 API를 구현하기 위해 이것 저것 살펴보던 도중 Body의 status는 원하는 대로 값이 들어갔지만, 막상 Http status code는 적용이 안되는 것을 발견했다 (우측 상단 Status 참고) ReponseEntity를 적용하여 다음과 같이 수정할 수 있었다 ResponseEntity를 적용한 Controller와 Service다 API 명세에 작성한 대로 HttpStatus를 적용해주고, body는 기존에 작성한 반환값을 넣어주었다! 여기서 또 한가지 문제를 마주했다 회원가입의 성공 코드는 201 CREATED인데, 기존의 코드는 성공이면 body의 status에 무조건 200을 리턴하게 되어있어 이 부분도 원하는 status 값을 리턴하도록 수정을 해주..

[Snacks 개발 일기] #1 Parameterized Test를 사용한 테스트 코드
2022. 11. 16. 14:42
Project/Snacks
회원가입 API를 개발한 후 테스트 코드를 작성하기로 했다 UserDto에 @Validated 어노테이션을 붙여주었기에, 정상적으로 유효한 값만 작동을 하는지에 대한 테스트 코드를 작성하는 중이었다 가장 작은 단위부터 테스트하는 단위테스트의 정의를 토대로 여러 유효성 검증 테스트를 작성하던 도중, 다른 팀원분께서 각 코드마다 중복된 사용의 문제점에 대해서 우려를 나타내셨다 그리고 팀원분은 한번에 유효성 검사를 하는 메소드를 원하셨다 각각 유효성 검사를 하면서 어느 유효성 검사를 하는지 알 수 있는 코드 vs 한번에 유효성 검사를 하되 어느 유효성 검사를 하는지 잘 알지 못하는 코드 2가지 테스트 코드 작성방향의 절충안을 다른 팀원분께서 알려주셨다 그 방법은 바로 Parameterized Test Para..