어제 오늘 내일

[Spring Security] 10편 - 한눈에 보는 JWT 동작 원리 (Sequence Diagram & 총정리) 본문

IT/SpringBoot

[Spring Security] 10편 - 한눈에 보는 JWT 동작 원리 (Sequence Diagram & 총정리)

hi.anna 2026. 2. 21. 00:20

드디어 Spring Security + JWT 시리즈의 마지막입니다! 👏
지금까지 우리는 설정(Config), 필터(Filter), 토큰 발급기(Provider), 로그인 로직(Service)을 각각 조각조각 구현했습니다.

오늘은 이 조각들이 실제로 합쳐져서 어떻게 동작하는지,

---
1. 로그인 할 때(토큰 발급)

2. API를 호출할 때(토큰 사용)

---

두 가지 흐름으로 나누어 시퀀스 다이어그램으로 정리해 보겠습니다.

 


1. 전체 흐름도 (Sequence Diagram)

 


2. 다이어그램 상세 분석

위 그림을 Flow 1 (로그인)Flow 2 (API 요청)로 나누어 자세히 뜯어보겠습니다.

📌 [Flow 1] 로그인 & 토큰 발급 (여권 만들기)

사용자가 처음 들어와서 ID/PW를 입력하고 "출입증(JWT)"을 받아가는 과정입니다.

  1. 로그인 요청: 클라이언트가 ID/PW를 담아 MemberController에 보냅니다.
  2. 인증 시도 (authenticate): MemberService는 스프링 시큐리티(AuthenticationManager)에게 "이 사람 진짜 회원 맞아?"라고 물어봅니다.
  3. DB 조회 (loadUserByUsername): 시큐리티는 우리가 3편에서 구현한 CustomUserDetailsService를 시켜서 DB에 있는 비밀번호와 사용자가 입력한 비밀번호를 대조합니다.
  4. 토큰 생성 (createToken): 비밀번호가 일치하면 인증 성공! JwtTokenProvider가 비밀키로 서명된 JWT 토큰을 찍어냅니다.
  5. 응답: 생성된 토큰이 클라이언트에게 전달됩니다. 클라이언트는 이 토큰을 잘 보관해야 합니다.

📌 [Flow 2] 토큰을 이용한 API 요청 (여권 보여주기)

이제 사용자가 로그인한 상태로, 게시글을 쓰거나 마이페이지를 조회하는 상황입니다.

  1. API 요청: 클라이언트는 HTTP 헤더(Authorization)에 Bearer 토큰을 담아서 보냅니다.
  2. 검문 검색 (JwtAuthenticationFilter): 요청이 컨트롤러에 닿기 전에 필터가 먼저 가로챕니다.
  • "잠깐! 여권(토큰) 확인하겠습니다."
  1. 유효성 검사 (validateToken): 필터는 JwtTokenProvider에게 토큰을 보여주고, 위조됐거나 만료되지 않았는지 확인합니다.
  2. 임시 로그인 (SecurityContext): 토큰이 정상이면, 토큰 안에 있는 정보(ID, 권한)를 꺼내서 스프링 시큐리티의 저장소(SecurityContext)에 넣어줍니다.
  • 이 과정이 끝나야 스프링은 "아, 이 요청은 로그인한 사람이 보낸 거구나"라고 인식합니다.
  1. 통과: 이제 비로소 Controller로 요청이 넘어가고, 원하는 데이터를 받아볼 수 있습니다.

3. 우리가 만든 핵심 컴포넌트 (Component) 요약

이 프로젝트를 지탱하는 4가지 핵심 클래스를 다시 한번 기억해 주세요.

클래스 이름 역할 비유
JwtTokenProvider 토큰 생성, 검증, 정보 추출 담당 조폐공사 + 위변조 감별기
JwtAuthenticationFilter 모든 요청을 가로채 토큰 유무 확인 공항 보안 검색대
SecurityConfig 세션 미사용(Stateless), 필터 등록 등 설정 공항 운영 수칙 (매뉴얼)
MemberService 실제 로그인(DB 검증) 수행 출입국 심사관

4. 최종 프로젝트 구조 (Directory Structure)

마지막으로 파일 위치를 점검해보세요. 이 구조가 머릿속에 그려진다면 성공입니다!

src/main/java/com/example/board
│
├── config
│   └── SecurityConfig.java      // [설정] 세션 끄기, 필터 배치, 권한 설정
│
├── controller
│   └── MemberController.java    // [API] 로그인, 회원가입 요청 받기
│
├── domain
│   ├── entity
│   │   └── Member.java          // [DB] 회원 테이블
│   └── repository
│       └── MemberRepository.java
│
├── dto
│   ├── MemberJoinDto.java
│   ├── MemberLoginDto.java
│   └── JwtToken.java            // [DTO] 토큰 응답 객체
│
├── jwt
│   ├── JwtAuthenticationFilter.java // [필터] 요청 가로채기
│   └── JwtTokenProvider.java        // [핵심] 토큰 생성 및 검증 기계
│
└── service
    ├── MemberService.java           // [로직] 로그인 수행
    └── CustomUserDetailsService.java // [로직] DB 유저 조회

🎉 정리

이제 여러분은:

  1. DB에 비밀번호를 암호화해서 저장할 줄 알고,
  2. Stateless(무상태) 서버가 무엇인지 이해했으며,
  3. 서버가 발행한 토큰만 있으면 어디서든 인증이 되는 REST API 서버를 구축할 수 있게 되었습니다.

 

반응형
Comments