2025/04 18

서버 + 프론트 장애 추적 가이드

Ⅰ . 한눈에 보기 1. 로그 레벨의 의미와 운영 기준TRACE: 극세밀 디버깅 (거의 안 씀)DEBUG: 개발 중 흐름 확인 (개발환경 전용)INFO: 정상 동작 기록 (운영환경에도 기록)WARN: 주의 상황 경고 (운영 모니터링)ERROR: 실패, 장애 기록 (운영 필수)로그 레벨은 "상황별 역할 구분"이지 "단계적 흐름"이 아니다.2. 특급 개발자의 로그 사용법TRACE는 극한 디버깅용DEBUG는 내 디버깅용 (운영에서는 끈다)INFO는 정상 흐름 기록용WARN은 위험 신호 감지용ERROR는 시스템 실패 기록용 (스택트레이스 필수)3. '추적성, 보안, 성능'을 고려한 로그 작성 4대 원칙누가-무엇을-언제를 남긴다.민감 데이터는 절대 기록하지 않는다.for문, 자주 호출 함수에는 디버그 로깅 주의...

웹 개발 2025.04.26

Spring Security - JWT 인증 흐름과 @AuthenticationPrincipal, 토큰 응답 처리 정리

1. JWT 인증과 @AuthenticationPrincipal 관계 정리항목 타입 설명JWT 토큰String예: "Bearer xxx.yyy.zzz" 형식. 클라이언트 → 서버 전달용@RequestHeaderString요청 헤더에서 토큰 직접 추출. 인증 필터에서 사용됨@AuthenticationPrincipalUserDetails 또는 CustomUserDetails필터에서 토큰을 검증한 후 생성한 사용자 정보 객체결론:@AuthenticationPrincipal은 "JWT 토큰"이 아닌, 토큰으로 인증한 사용자 객체를 받는 것이므로, 참조 자료형(CustomUserDetails 등) 사용하는 게 맞음.왜 Security Filter Chain을 꼭 거쳐야 할까?Spring Security의 기본 인..

웹 개발/Spring 2025.04.26

Spring Security 인가 DSL 메서드 정리

메서드 분류 설명 핵심 차이permitAll()인가 DSL (Authorization DSL)인증 여부와 무관하게 모든 사용자에게 접근 허용토큰 없어도 허용, 로그인/회원가입 등 공개 API에 사용authenticated()인가 DSL인증된 사용자만 접근 가능큰 있어야 허용, 로그인 이후 사용자 전용 APIhasRole("ADMIN")인가 DSLROLE_ADMIN 역할을 가진 사용자만 접근 가능인증 + "역할" 기반 제한hasAuthority("ROLE_ADMIN")인가 DSLROLE_ADMIN 권한을 가진 사용자만 접근 가능인증 + "권한" 문자열 기반 제한, hasRole보다 더 유연함denyAll()인가 DSL모든 사용자 접근 차단, 주로 테스트나 임시 비활성화용항상 차단됨, 모든 접근 불가

웹 개발/Spring 2025.04.25

@PathVariable VS @RequestBody VS @RequestParam 사용하는 경우

@PathVariable을 사용하는 경우URL 경로에 포함된 리소스 식별자를 받을 때 사용.REST API에서는 "어떤 리소스에 접근할 것인지"를 URL로 표현하기 때문.예시:GET /users/42@GetMapping("/users/{id}")public ResponseEntity getUser(@PathVariable Long id)→ id는 리소스를 식별하는 값이므로 @PathVariable로 받기.@RequestBody를 사용하는 경우JSON이나 Form 데이터 같은 복잡한 입력 데이터를 처리할 때 사용.주로 POST, PUT, PATCH처럼 서버에 데이터를 전송하거나 수정할 때 사용.예시:POST /usersContent-Type: application/json{ "name": "홍길동", ..

웹 개발 2025.04.25

JWT 저장 & 통신 방식

JWT 저장 & 통신 방식 정리표저장 방식 전송 방식 장점 단점 주요 위험요소 권장 상황localStorageAuthorization 헤더 (Bearer ${token})- 구현 간단- 새로고침 유지- 브라우저간 공유 가능 (같은 도메인)❌ XSS 취약❌ 자바스크립트 접근 가능XSS개인용 앱, 내부 시스템, MVPsessionStorageAuthorization 헤더 (Bearer ${token})- XSS 대비 약간 유리 (탭마다 분리)- 새로고침만 날아감❌ 새로고침 시 날아감❌ XSS 여전히 가능XSS인증 테스트/임시 보안 필요한 상황HttpOnly 쿠키자동으로 쿠키 전송 (withCredentials: true)- XSS로부터 안전- 자동 전송으로 UX 우수❌ CSRF 방어 필요❌ 쿠키 설정 복잡❌..

웹 개발 2025.04.24

REST와 REST 컨벤션 개념 정리

REST와 REST 컨벤션 정리REST란?REST(Representational State Transfer)는 웹에서 리소스를 HTTP URI(URL)로 표현하고, **HTTP 메서드(GET, POST, PUT, DELETE 등)**를 통해 리소스를 조회/생성/수정/삭제하는 아키텍처 스타일이다.특징리소스(데이터)는 URL로 표현리소스의 상태 변경은 HTTP 메서드로 표현클라이언트-서버 구조무상태성(Stateless)계층적 URI 구조예시GET /users → 전체 사용자 조회GET /users/1 → 1번 사용자 조회POST /users → 사용자 생성PUT /users/1 → 1번 사용자 전체 수정DELETE /users/1 → 1번 사용자 삭제REST 컨벤션이란?REST를 실무에서 일관성 있게 사용하..

웹 개발 2025.04.24

id vs 인증 사용자 정보 차이

정리: @AuthenticationPrincipal vs @PathVariable id구분 목적 방식 사용 예@PathVariable Long id특정 리소스(DB 행) 식별URL로 직접 id 받음GET /api/quizzes/{id}@AuthenticationPrincipal UserDetails현재 로그인한 사용자 정보JWT에서 email 등 추출해서 자동 주입DELETE /api/auth/profile핵심 포인트"본인 정보"를 조회/수정/삭제할 때는 @AuthenticationPrincipal로 email이나 username을 받아서 사용받은 정보로 DTO의 email, userId, role 등을 채우고 DB에서 findByEmail()이나 findByUserId()로 사용자 데이터 조회예시 흐름..

웹 개발 2025.04.24

엔드포인트 설계(프론트, 백 HTTP통신시 중요)

리소스 중심 (RESTful): URL은 '무엇'을 다루는지에 집중 (/posts, /users, /places)행동은 HTTP Method로 표현: GET, POST, PUT, DELETE, PATCH명확하고 일관된 구조: /api/{리소스}/{id}, 서브리소스는 /api/{리소스}/{id}/{하위리소스}접두어 통일: /api 고정, 관리자는 /api/admin 따로간결하면서 직관적: 의미 있는 단어만 사용하고, 복잡한 쿼리는 파라미터로 리소스 메서드 엔드포인트 예시 설명게시글 조회GET/api/posts전체 게시글 조회게시글 작성POST/api/posts게시글 생성게시글 상세GET/api/posts/{postId}특정 게시글 조회게시글 수정PUT/api/posts/{postId}게시글 전체 수정게시..

웹 개발 2025.04.23

Spring security 패턴 매칭 기호(프론트, 백 HTTP통신시 중요)

Spring Security의 패턴 매칭 기호패턴 의미 예시 매칭 대상*한 경로 조각 (슬래시 / 사이 한 개)/api/*/api/test, /api/1**모든 경로(하위 디렉토리 포함)/api/**/api/test, /api/a/b/c?한 글자/api/t?st/api/test, /api/tast예시1. * 하나 (한 계층)/api/* → 매칭 대상:/api/hello ✅/api/hello/world ❌ (계층이 2단계라 안됨)2. ** 두 개 (모든 하위 경로)/api/** → 매칭 대상:/api/hello ✅/api/hello/world ✅/api/1/2/3 ✅**는 현재 경로 이후 모든 경로까지 포함하는 와일드카드야.TIP*는 /를 포함하지 않는 단일 경로 조각 하나**는 디렉토리 전체 하위 포함실..

웹 개발/Spring 2025.04.23

JPA N+1 문제 해결법

JPA N+1 문제 최종 정리N+1 문제란?**"한 번의 쿼리(1)로 N개의 데이터를 가져온 후, 각 데이터에 대해 추가 쿼리(N)를 실행하는 비효율적인 쿼리 문제"**를 말합니다.발생 예시List members = em.createQuery("SELECT m FROM Member m", Member.class).getResultList();for (Member m : members) { System.out.println(m.getTeam().getName());}위 코드 실행 시 다음과 같은 쿼리 발생:SELECT * FROM member → 1번 실행SELECT * FROM team WHERE id = ? → 멤버 수만큼 실행 (N번)→ 총 1 + N번 쿼리 실행됨원인연관 관계가 fetch = ..

카테고리 없음 2025.04.17