✒️ 들어가기 전카카오 OAuth 로그인을 구현하는 방법에 대해 상세히 알아보자.다음 글은 KAKAO DEVELOPLER 공식 문서를 참고하여 작성함.https://developers.kakao.com/docs/latest/ko/kakaologin/commonhttps://developers.kakao.com/docs/latest/ko/kakaologin/rest-api 구현 코드https://github.com/jinho7/6th_SPRING/commit/75637e4bed09b0eba2807db00a45c60f39b591f5 ✒️ OAuth의 개념 이해OAuth는 Open Authorization의 약자이다.애플리케이션이 특정 시스템의 보호된 리소스에 접근하기 위해,사용자 인증(Authenticat..
BackEnd
✒️ 0. 들어가기 전 : 간단한 CRUD도 고민할 게 너무 많다."개발"을 잘한다는 것은 무엇일까?우리는 코더가 아닌 개발자이다. 누군가는 무슨 최신 기술을, 누군가는 어떤 것까지 할 수 있다고 말한다.과연 그 기술을 어디까지 알며, 왜 사용했고, 어떤 로직으로 굴러가지는 설명할 수 있을까?되묻고 싶다. 왜 여기서는 RequestParam을 썼고, 여기는 왜 PathVariable로 썼고,에러처리는 어떻게 했고, RestControllerAdvice를 사용했는데 그 원리는 무엇이고,시큐리티와 JWT는 왜 썼고, 세션과 쿠키와 토큰의 차이는 무엇이며..내 코드의 성능은 얼마나 좋을까? 더 개선할 수는 없을까?...................... 나는 CRUD 하나만 해도 충분히 고민할 게 넘쳐난다고 ..
🤔 문제 인식우리는 엔티티를 설계하다 보면 여러 Table을 매핑 할 때가 너무 너무 많고,어쩌면 "내부로직"을 모르고 가져다 쓰는 경우가 많은 것 같다. 한 번 내 코드를 봐보자.@Entity@Table(name = "user")@Builder@Getter@NoArgsConstructor(access = AccessLevel.PROTECTED)@AllArgsConstructor(access = AccessLevel.PRIVATE)public class User extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // ... 중략 // Mapping @On..
1. 문제점SpringSecurity/JWT를 사용한, 인증/인가 과정에서 발생하는 Exception을 처리하고 에러를 표준화하는 과정에서 문제가 발생했다.JWT 로그인 구현 중 UsernameNotFoundException 처리가 안 되는 현상이 발생한 것중요한 것은우리가 원하는 것은 로그인 실패 응답을 두 가지 케이스로 나누는 것."존재하지 않는 회원의 이메일입니다.""비밀번호가 일치하지 않습니다."하지만, 포스트맨을 통해 확인한 결과 모두, 잘못된 자격증명으로 답변이 온다...2. 원인파악코드를 순서대로 따라가보자.UsernamePasswordAuthenticationFilter를 확장하여 커스터마이징한, LoginFilter를 살펴보자.여기서, 실패한 경우 @Override protec..
1. 사건의 발단날씨 앱을 만드는 과정에서사용자가 설정창에서 ON 해놓은 정보들만 메인 화면에 띄울 수 있는 기능이 있다. 그래서 dto를 이렇게 잡고 시작했다.public record DisplayDto( boolean precipitation, boolean wind, boolean dust) {} 자.. 이제 수정 하기 위해 코드를 짰다.// 메인 화면 날씨 상세 정보 보기 (강수량, 퓽향/풍속, 미세먼지)@PutMapping("/display")public ApiResponse updateDisplay(@AuthUser User user, @RequestBody SettingReqDto.DisplayDto displayDto) { settingServic..
해당 포스트 (1) ~ (7) 과정의 코드를 리펙토링 한 것이다! Spring Boot에서 JWT 프로젝트 세팅하기 / Filter 테스트 (1)VERSION springboot : '3.2.3' java : '17' 1. build.gradle에 Dependecy 추가 plugins { id 'java' id 'org.springframework.boot' version '3.2.3' id 'io.spring.dependency-management' version '1.1.4' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sjinhos-devlog.tistory.com수정한 부분만 설명하겠다! 0. 프로젝트 설명해당 구조로 이루어지며,- co..
자 모든 기능 구현이 끝났다. POSTMAN으로 테스트를 해보자! 1. 아무 인가/인증도 걸려있지 않은 http://localhost:8080/ 에 접근 - Filter - Controller - .anyRequest().permitAll() 에 걸리게 되어 인증하지 않아도 통과할 것이다! 1-1. Success Case 2. 로그인 없이 http://localhost:8080/user에 접근 - Filter - Controller - .requestMatchers("/user/**").authenticated() 가 걸려기에 User 권한을 가진 사용자가 로그인 하지 않으면, Error가 날 것! 2-1. Error Case 3. 로그인 테스트 3-1. Success Case : Body에 DB에 있는..
JWT 토큰 서버 구축하기 (인가/인증) (5) - RefreshToken으로 토큰 재발급 JWT 토큰 서버 구축하기 (인가/인증) (4) - 인가 처리 필터 JWT 토큰 서버 구축하기 (인가/인증) (3) - 엑세스토큰 발급하기 JWT 토큰 서버 구축하기 (인가/인증) (2) - 로그인 과정 처리 해당 POST 보고 오 jinhos-devlog.tistory.com 이어서... 1. 로그아웃 처리에 대한 고민... 1-1. 이미 발급한 토큰의 상태 변화 우리는 로그아웃을 할 때 발급했던 AccesToken과 RefreshToken을 강제로 만료시켜야 한다. 참, Stateless한 토큰을 사용할 때 항상 고민되는 부분이다. 문제점 : 이미 발급한 토큰의 상태 변화에 대응하기 어렵다! 즉, statel..