문제액세스 토큰과 리프레쉬 토큰을 어떤 응답 방식과 양식으로 담아야 하는지. 상황얼마 전 개인 프로젝트에서 인증 부분을 실제 서비스를 염두에 둔다면 어떤 식으로 처리를 할지 고민했던 적이 있다. JWT로 Access token, Refresh token을 이용해서 인증 방식을 택했고, 로그인 시액세스 토큰을 응답 헤더의 Access-Token 키에,리프레쉬 토큰을 HttpOnly 쿠키로 Refresh-Token 키에넣어서 보내주었다. 액세스 토큰을 헤더에, 리프레쉬 토큰을 쿠키에 넣은 이유는 아래와 같았다. 프론트에서는 액세스 토큰을 로컬스토리지에 저장하게 하고, 리프레쉬 토큰은 쿠키 저장소에 저장되어 저장소를 분리시켰다. 만약 한 저장소가 뚫려도 다른 저장소의 토큰은 안전하도록 의도를 담았다.리프레..
TIL ✍️
상황 개인적으로 하는 프로젝트에서 AOP를 썼었다. Refresh token을 쓰고 있었고, 이를 레디스에 저장하고 있었다. 토큰 속에는 닉네임을 subject 로 가지고 있었다. 문제는 닉네임을 수정하면 리프레쉬 토큰에는 변경이 되지 않아서 로그인이 안 되는 것. 그래서 레디스 속 리프레쉬 토큰을 변경해주어야 했고, 변경된 리프레쉬 토큰을 응답 쿠키에 담아주어야 했다. 또 유저 삭제 시에도 리프레쉬 토큰을 레디스에서 삭제하고, 응답 쿠키도 삭제해야했다. 이를 AOP로 구현한 코드는 아래와 같다. 간략하게 설명하면,@Pointcut 으로 각각 닉네임 수정 시점, 유저 삭제 시점 을 지정해주었고,@Around 로 수정 직후, 삭제 직후에 리프레쉬 토큰 처리를 해주었다. @Slf4j(topic = "..
나는 질문(Question) 1 : N 답변(Answer) 로 구성을 하고, 하나의 질문을 조회할 때는 그 질문에 대한 답변을 가져오기로 했다.근데 가져온 데이터가 중복이 된 것.{ "status": "OK", "code": 0, "message": "정상 처리 되었습니다", "data": [ { "id": 1, "content": "질문01", "views": 7, "createdAt": "2024-06-20T11:59:45", "modifiedAt": "2024-06-24T18:44:59.361887" }, { "id": 1,..
닉네임을 변경하는 API에서, 요청하는 DTO의 검증을 달고 있었다. public record UserUpdateNicknameReq( @NotBlank(message = "닉네임은 빈 값이면 안 됩니다.") @Size(min = 1, max = 35, message = "닉네임은 1자 이상, 35자 이하여야 합니다.") @Pattern(regexp = "^[a-zA-Z0-9가-힣]$", message = "닉네임은 한글 및 숫자와 영어만 가능합니다.") String nickname) {}원래 DTO는 @Pattern(regexp = "^[a-zA-Z0-9가-힣]$ 였는데, 닉넴을 monkey→1 로 바꾸는 건 됐는데, 1→monkey로 바꾸니 변경이 안 됐다. 다른 블로그를 보니 ..
HardDelete 와 SoftDelete 가 있다. HardDelete는 삭제 요청이 오면 DB에서 바로 삭제를 한다. SoftDelete는 삭제 요청이 오면 바로 삭제 처리를 하지 않고, 삭제 플래그를 표시해두어 DB에는 남겨둔다. 많은 SoftDelete 구현 방법이 있지만, 나는 datetime을 nullable로 두어 null이 아닌, 날짜가 기입되면 삭제처리를 한 것으로 두어 삭제 시간을 알 수 있도록 했다. 나중에 배치로 일주일의 간격을 두고 실제로 삭제할 예정이다. @Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseEntity { @Column(name = "..
지금까지 프로젝트에서는 헤더에 JWT를 담아 보냈었다. 근데 부트캠프 최종 프로젝트의 옆 팀의 분께서 쿠키에도 보내는 방식이 있다는 걸 알려준 후로 머릿속에 두긴 했는데, 이번에는 쿠키에 넣어서 프로젝트를 진행해보기로 했다. https://velog.io/@0307kwon/JWT%EB%8A%94-%EC%96%B4%EB%94%94%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%B4%EC%95%BC%ED%95%A0%EA%B9%8C-localStorage-vs-cookie JWT는 어디에 저장해야할까? - localStorage vs cookie이번에 지하철 미션을 만들면서 JWT를 클래스 property에 저장했었는데 리뷰어 분께 해당 부분을 피드백 받으면서 어디에 JWT를 저장하는 것이 좋..
자바에서 JWT를 다루는 라이브러리 중 JJWT 가 있다.https://github.com/jwtk/jjwt?tab=readme-ov-file#jws-example GitHub - jwtk/jjwt: Java JWT: JSON Web Token for Java and AndroidJava JWT: JSON Web Token for Java and Android. Contribute to jwtk/jjwt development by creating an account on GitHub.github.com 기존 프로젝트에서 0.11.5 버전을 쓰고 있었는데, 이번에 개인 프로젝트에서 0.12.5 버전으로 올리면서 바뀐 부분을 다뤄보려고 한다. 우선 Key 부분이 SecretKey와 PublicKey 로 나..
이번에 하는 프로젝트가 있어서 AWS EC2 인스턴스에 mysql 을 깔고 워크벤치로 접속을 시도하려니 에러가 났다. Failed to Connect to MySQL at 127.0.0.1 with user root 처음에는 스타벅스 와이파이로 접속 중이어서 3306 포트를 막아둔 건가? 싶었는데 집에 와서도 같은 에러가 났다. 분명 블로그에 나온대로 bind-address = 0.0.0.0 으로 변경하여 외부 접속을 허용해줬는데 안 됐다. 포트도 기본 포트가 아닌 다른 포트로 했어서 그것 때문인가 싶었는데, 보안그룹의 인바운드 설정까지 확인해봐도 이상이 없었다. 근데 재시작을 안 한 거였다 ㅋ sudo service mysql restart 하니 됐다.
JUnit5 에서는 여러 조건에 따른 테스트 실행 여부를 결정하는 기능을 제공한다. OS, JRE, property, 환경변수 등에 따라 제어할 수 있고, 이는 org.junit.jupiter.api.condition 패키지에서 확인할 수 있다. public class OSTest { @Test @EnabledOnOs(OS.MAC) @EnabledOnJre(JRE.JAVA_17) void mac_jre17_test() { System.out.println("메롱"); } @Test @EnabledOnOs(OS.MAC) @EnabledOnJre(JRE.JAVA_20) void mac_jre20_test() { System.out.println("바보"); } @Test @EnabledOnOs(OS.WIND..