Tech Stack

[Spring MVC] DispatcherServlet(디스패처 서블릿)이란 무엇인가?

[Spring MVC] DispatcherServlet(디스패처 서블릿)이란 무엇인가? Spring MVC 프레임워크를 공부하다 보면 가장 먼저 마주치는 개념이 바로 DispatcherServlet(디스패처 서블릿)입니다. 간단히 말해, 모든 HTTP 요청을 가장 먼저 받아 적절한 컨트롤러로 배달해주는 '중앙 창구' 역할을 합니다. 1. 디스패처 서블릿의 정의 Dispatcher는 "보내다(파견하다)"라는 뜻을 가지고 있습니다. Servlet 컨테이너의 가장 앞단에서 요청을 받아 관리하는 패턴을 Front Controller 패턴이라고 부르는데, 스프링에서는 이를 DispatcherServlet이 담당합니다. 핵심 특징: 과거에는 모든 서블..

[JPA] 2. 엔티티와 값 타입

JPA 시리즈 2편2. 엔티티와 값 타입 JPA를 처음 접하면 모든 클래스가 비슷하게 느껴집니다. 예를 들면, 회원 클래스도 있고, 주소 클래스도 있고, 주문 클래스도 있습니다. 겉보기에는 다 그냥 객체처럼 보이지만, JPA는 이들을 같은 방식으로 다루지 않습니다. 어떤 객체는 따로 관리하고, 어떤 객체는 다른 것에 붙어서 함께 움직입니다. 이 차이를 이해하기 시작하면 JPA가 점점 명확하게 다가오게 됩니다. 처음에 클래스를 설계할 때는 뭔가 다 비슷해 보입니다. 회원 정보를 위한 Member 클래스, 주소를 담는 Address 클래스, 그리고 주문을 나타내는 Order 클래스가 있죠. 자바 코드만 봐서는 전부 그냥 객체이고, 필드도 있고 생성자도 있고 값을 넣어 쓸 수 있습니다. 그래서 아마 처음엔 “..

[JPA] 1.JPA란?

JPA 시리즈 1편1. JPA란? 처음 JPA를 접하게 되면, 종종 SQL을 자동으로 만들어주는 도구라고만 여기는 경우가 많습니다. 하지만 JPA를 단순히 SQL 자동 생성 기술로만 이해한다면 곧 한계에 봉착하게 됩니다. JPA의 진짜 본질은 객체의 상태 변화와 그 관계를 데이터베이스에 어떻게 반영할 것인가에 초점이 맞춰져 있습니다. 처음 JPA를 배우면 대부분 이렇게 떠올립니다. 엔티티를 만들고 persist()를 호출하면 insert가 나가고, 값을 바꿨더니 update 쿼리가 실행된다. 이 경험 때문에 JPA를 단순히 자바 객체를 데이터베이스에 저장해주는 기술이라고만 쉽게 정의하고 넘어가기 쉽습니다.하지만 실제로 JPA의 구조와 개념은 이보다 훨씬 복잡하고 깊이가 있습니다. 예를 들어, 쿼리가 생각..

[Spring] JWT 05. RefreshToken DB 저장 + 1회성 폐기(로테이션) + 재발급 흐름 완성

[Spring] JWT 05. RefreshToken DB 저장 + 1회성 폐기(로테이션) + 재발급 흐름 완성AccessToken은 짧게, RefreshToken은 길게 사용합니다.하지만 RefreshToken을 그냥 클라이언트에만 두면 탈취 위험이 있습니다.그래서 실무에서는 RefreshToken을 DB에 저장하고 1회성으로 폐기(로테이션)하는 방식을 많이 사용합니다.1. 왜 RefreshToken을 DB에 저장해야 할까? 탈취된 RefreshToken 무효화 가능 중복 로그인 제어 가능 (1인 1토큰) 로그아웃 시 강제 만료 가능즉, AccessToken은 Stateless,RefreshToken은 Stateful하게 관리하는 전략입니다.2. DB 테이블 설계 예시CREATE TABLE mem..

[Spring] JWT 04. 만료 임박 자동 갱신(TokenRenewalInterceptor) 적용

[Spring] JWT 04. 만료 임박 자동 갱신(TokenRenewalInterceptor) 적용 (응답 헤더로 새 토큰 내려주기)JWT를 운영하다 보면 AccessToken 만료 때문에 사용자 경험이 끊기는 문제가 생깁니다.이를 줄이기 위해 만료 임박(예: 10분 이하)이면 서버가 자동으로 새 AccessToken을 발급해서응답 헤더로 내려주는 방식을 사용할 수 있습니다.1. 자동 갱신 방식이란?요청이 들어오면 서버가 AccessToken의 남은 시간을 확인하고,만료가 임박하면 새 AccessToken을 만들어서 응답 헤더에 같이 담아줍니다. 클라이언트가 AccessToken으로 API 요청 서버가 토큰 남은 시간(remain)을 계산 남은 시간이 기준(renewal-limit)보다 작으면 새..

[Spring] JWT 03. Interceptor로 인증 적용하기 (로그인 필요 API 보호)

[Spring] JWT 03. Interceptor로 인증 적용하기 (로그인 필요 API 보호)JWT를 발급했다면 이제 “로그인 필요한 API”를 보호해야 합니다.Spring에서는 보통 Security Filter를 많이 쓰지만, 프로젝트 구조에 따라 Interceptor로도 충분히 구현할 수 있습니다.이번 글은 Interceptor 기반 JWT 인증 흐름을 정리합니다.1. Interceptor로 JWT 인증을 하는 이유 컨트롤러 실행 전에 요청을 가로채서 검사할 수 있음 특정 URL 패턴만 “로그인 필요”로 지정 가능 JWT 파싱 후 loginId / 권한을 request에 담아 컨트롤러에서 사용 가능핵심 목표는 딱 2가지입니다. Authorization 헤더에 토큰이 없거나 잘못되면 → 401..

[Spring] JWT 02. AccessToken / RefreshToken 구조 + 재발급 흐름

[Spring] JWT 02. AccessToken / RefreshToken 구조 + 재발급 흐름 JWT를 실제 서비스에서 쓰려면 보통 토큰을 2개로 나눕니다.AccessToken은 짧게, RefreshToken은 길게 가져가서 보안을 올리는 방식입니다.1. 왜 토큰을 2개로 나눌까?AccessToken 하나만 오래 쓰면 보안이 약해집니다. (탈취되면 오래 위험)그래서 AccessToken은 짧게(예: 10~30분), 만료되면 RefreshToken으로 재발급 받습니다. 구분 AccessToken RefreshToken 역할 API 요청 인증 AccessToken 재발급 만료 짧음 (1..

[Spring] JWT 01. Json Web Token 개념정리

[Spring] JWT(Json Web Token) 정리JWT(Json Web Token)는 로그인 이후 세션을 대신해서 사용자 인증을 처리하는 토큰 방식입니다.비밀번호를 대신하는 것이 아니라, 로그인 성공 후 발급되는 인증 증표입니다.1. 비밀번호와 JWT의 차이비밀번호 → 로그인할 때만 사용 (DB에는 해시 저장)JWT → 로그인 성공 후 발급, 이후 요청마다 전송로그인 흐름은 아래와 같습니다.아이디 + 비밀번호 전송서버가 비밀번호 검증성공하면 JWT 발급이후 요청은 JWT로 인증2. JWT 구조JWT는 3개의 영역으로 구성됩니다.Header.Payload.SignatureHeader : 알고리즘 정보 (예: HS256)Payload : 사용자 정보(Claim)Signature : 위변조 방지 서명중..