[Auth] OAuth2 로그인 시 Access Token을 헤더에 담는 방법
·
Teck Stack/Spring
개요지난 글에 이어 이번에는 OAuth2 로그인 방식에서 JWT를 Access Token / Refresh Token 구조로 사용할 때, Access Token을 헤더에 담는 방법을 다루어보고자 합니다. 문제 상황Access Token과 Refresh Token으로 인증을 관리하게 되면 다음과 같은 구조로 설계하게 됩니다. Access TokenHTTP Header에 담는다.Authorization : Bearer {AccessToken} Refresh TokenHttpOnly 쿠키에 담는다. 하지만 OAuth2 소셜 로그인에 성공하면, 리다이렉트가 수행되어 Access Token을 헤더에 담아 전달할 수 없습니다. 그렇다면 Access Token을 어떻게 헤더로 가져올 수 있을까요? 우선 Refre..
[Auth] OAuth2 구글 로그인 + JWT 방식의 인증 플로우
·
Teck Stack/Spring
개요OAuth2와 JWT로 인증을 구현 후, 복습하면서 OAuth2 + JWT 인증 플로우를 정리하게 되었습니다. Google 인증 연동 과정 및 코드는 첨부하지 않고, 인증 플로우에 대해 정리하고자 합니다. OAuth2 Code Grant 방식의 동작 순서OAuth2의 Code Grant 방식은 다음과 같은 순서로 동작합니다. 1. 로그인 페이지로 이동2. ID, Password로 로그인 요청3. 로그인이 성공하면 설정한 redirect_url로 리다이렉트가 되며 쿼리 파라미터로 코드를 전달4. 코드를 통해 인증 서버에 access 토큰 요청 (여기서 access_token은 Google API로 전송하기 위한 토큰)5. access 토큰을 통해 유저 정보를 요청 및 획득 OAuth2 로그인 책임..
[Spring] @Scheduled 대신 Quartz를 사용한 스케줄링 구현
·
Teck Stack/Spring
개요공연 예매 프로젝트를 진행하면서 좌석 상태 변경에 대한 요구사항을 하나 추가했습니다. 좌석을 선택하고 예매하면 좌석의 상태는 [선점된 좌석]으로 변경됩니다. 그 이후에, 결제를 성공적으로 완료하면 좌석의 상태가 [결제 완료 좌석]으로 변경됩니다. 위와 같이 좌석 상태를 구분한 이유는 실제 운영 중인 티켓팅 서비스를 사용했을 때콘서트 좌석을 예매하다가 결제 과정에서 오류가 발생했던 경험이 있습니다. 결제만 했으면 좋은 좌석을 예매할 수 있었지만, 예매 자체가 초기화되었던 경험이 있습니다. 그러므로 좌석을 선택해서 예매를 먼저 처리하고 이후 결제를 처리하도록 했습니다. 하지만, 이 방식을 사용하게 된다면 좌석을 결제하지 않고 선점하고 있을 가능성이 있다고 생각했습니다. 더 많은 좌석을 판매하기 위해서는 ..
[Spring] 외부 API 요청 시 상태 코드별 재시도 전략
·
Teck Stack/Spring
개요최근 모 스타트업 인턴으로 지원하여 면접을 보고 왔습니다. 서류->과제->1차 면접->2차 면접으로 진행되었고, 저는 1차 면접을 보고 탈락했습니다. 1차 면접에서 과제와 포트폴리오 관련 질문을 주셨는데, 그중에서도 가장 기억에 남는 질문은 다음과 같습니다.💡 외부 API 요청이 400 또는 429 등 에러코드를 제공했을 때 재시도 로직을 실행시킬 것인가? 이 질문에 대한 대답이 기억나진 않지만, 제대로 대답하지 못한 것 같습니다. 다음에는 제대로 대답할 수 있도록, 질문에 맞는 정답을 찾아보고 기록하려 합니다. 문제 상황 과제의 핵심은 AI 요청을 보내는 것이었습니다. Spring Boot 웹애플리케이션에서 외부 API 호출 요청을 보내어 AI요청 결과를 저장해야 했습니다. 프로젝트 설계는 다..
[Spring] MultipartFile + DTO 요청 받기 (feat : 415 에러 해결)
·
Teck Stack/Spring
개요프로젝트를 진행하면서 이미지 파일과 JSON 데이터를 한 번에 받아콘서트 정보를 저장하는 기능 개발 중 마주친 415 Unsupported Media Type의 해결과정을 다루어보고자 합니다. 처음에는 데이터를 받기 위해 @RequestBody로 이미지와 필요한 JSON 데이터를 받아 RegisterConcertRequest라는 DTO에 매핑하고자 했습니다. @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity register( @RequestBody RegisterConcertRequest registerConcertRequest) { return Response..