2026. 6. 24. 15:14ㆍ부트캠프/TIL(Today I Learned)
TIL (Today I Learned) - Spring Bean, 인증/인가, Session & JWT
오늘 배운 내용
오늘은 Spring에서 Bean을 등록하는 방법과 동일한 타입의 Bean이 여러 개 존재할 때 해결하는 방법, 그리고 인증(Authentication)과 인가(Authorization), Session과 JWT에 대해 학습했다.
1. Bean 수동 등록
Spring에서는 @Component, @Service, @Repository 등을 이용해 Bean을 자동 등록하는 방식을 주로 사용한다.
하지만 기술적인 설정이나 공통 관심사(Cross Cutting Concern)를 처리하는 객체는 수동 등록을 사용하는 것이 좋다.
예를 들어:
- PasswordEncoder
- 공통 로그 처리
- 공통 예외 처리
- 보안 관련 설정
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
이렇게 등록된 객체는 Spring Container가 관리하며 필요한 곳에 DI(의존성 주입)를 할 수 있다.
2. 같은 타입의 Bean이 여러 개일 때
public interface Food {
void eat();
}
@Component
public class Chicken implements Food {}
@Component
public class Pizza implements Food {}
위처럼 같은 타입의 Bean이 두 개 존재하면 Spring은 어떤 Bean을 주입해야 할지 알 수 없어 오류가 발생한다.
해결 방법 1. Bean 이름 사용
@Autowired
Food pizza;
변수명과 Bean 이름을 맞춰 특정 Bean을 주입할 수 있다.
해결 방법 2. @Primary
@Component
@Primary
public class Chicken implements Food {}
@Autowired
Food food;
동일 타입 Bean이 여러 개일 경우 @Primary가 붙은 Bean이 우선적으로 주입된다.
해결 방법 3. @Qualifier
@Component
@Qualifier("pizza")
public class Pizza implements Food {}
@Autowired
@Qualifier("pizza")
Food food;
명시적으로 원하는 Bean을 지정할 수 있다.
우선순위
@Qualifier > @Primary
실무에서는
- 기본적으로 많이 사용하는 Bean → @Primary
- 특정 상황에서만 사용하는 Bean → @Qualifier
를 사용하는 것이 좋다.
3. 인증(Authentication)과 인가(Authorization)
인증 (Authentication)
사용자가 실제로 누구인지 확인하는 과정이다.
예시
- 로그인
- 지문 인식
- 얼굴 인식
인가 (Authorization)
인증된 사용자가 특정 자원에 접근할 수 있는지 확인하는 과정이다.
예시
- 관리자 페이지 접근 권한
- 게시글 수정 권한
즉,
인증 = "너 누구야?"
인가 = "이 기능 써도 돼?"
4. Stateless와 로그인 유지
HTTP는 기본적으로 Stateless(무상태성) 방식이다.
즉, 서버는 이전 요청 정보를 기억하지 않는다.
그렇다면 로그인 상태는 어떻게 유지할까?
대표적인 방식은
- Session 방식
- JWT 방식
이다.
5. Session 방식
로그인 성공 시
- 서버가 사용자 정보를 확인
- 세션 저장소에 로그인 정보 저장
- Session ID 생성
- Session ID를 쿠키에 담아 클라이언트에게 전달
- 이후 요청마다 Session ID를 함께 전송
- 서버는 Session ID를 통해 사용자 식별
특징
- 서버가 로그인 상태를 기억
- 관리가 쉬움
- 서버가 많아질수록 세션 공유 문제 발생
6. Cookie와 Session
Cookie
브라우저에 저장되는 작은 데이터이다.
구성 요소
- Name
- Value
- Domain
- Path
- Expires
Session
서버가 클라이언트 상태를 유지하기 위해 사용하는 저장소이다.
실제 로그인 정보는 서버에 저장되고, 브라우저에는 Session ID만 저장된다.
7. JWT(Json Web Token)
JWT는 사용자 정보를 토큰 형태로 암호화하여 전달하는 방식이다.
로그인 과정
- 로그인 요청
- 사용자 검증
- JWT 생성
- 클라이언트에게 JWT 전달
- 클라이언트가 저장
- 이후 요청마다 JWT 전송
- 서버가 JWT 검증 후 사용자 확인
Session과의 가장 큰 차이점은
Session은 서버가 로그인 상태를 저장하지만
JWT는 로그인 정보를 토큰 안에 담아 클라이언트가 가지고 있다는 점이다.
8. JWT를 사용하는 이유
서버가 1대일 때는 Session 방식이 문제가 없다.
하지만 서버가 여러 대가 되면
- Session 동기화
- Session Storage 구축
- Sticky Session
등을 고려해야 한다.
JWT는 서버가 로그인 상태를 저장하지 않기 때문에 여러 서버 환경에서 유리하다.
9. JWT 구조
JWT는 크게 3부분으로 구성된다.
Header
토큰 타입과 암호화 알고리즘
{
"alg": "HS256",
"typ": "JWT"
}
Payload
사용자 정보 저장
{
"username": "user",
"admin": true
}
Signature
위조 방지를 위한 서명
Header + Payload + Secret Key
JWT는 누구나 Payload를 볼 수 있지만 Secret Key 없이는 수정할 수 없다.
10. JWT 장단점
장점
- 서버 부하 감소
- 확장성 좋음
- 서버 여러 대 환경에 적합
- OAuth2 등 외부 인증에 활용 가능
단점
- 구현 난이도 증가
- 토큰 크기 증가 시 네트워크 비용 증가
- 발급된 토큰을 강제로 폐기하기 어려움
- Secret Key 유출 시 위험
문제
Session과 JWT의 차이 이해 부족
해결
로그인 요청부터 인증 유지 과정까지 직접 흐름을 정리하면서 비교했다.
결과적으로
- Session = 서버가 로그인 상태 저장
- JWT = 클라이언트가 로그인 정보 보관
이라는 핵심 차이를 이해할 수 있었다.
새롭게 알게 된 점
- Bean 수동 등록은 기술 지원 객체나 공통 관심사에 주로 사용된다.
- @Qualifier가 @Primary보다 우선순위가 높다.
- Session은 서버가 상태를 관리한다.
- JWT는 서버가 상태를 저장하지 않아 확장성이 좋다.
- JWT의 Payload는 암호화가 아닌 인코딩된 정보이므로 민감한 데이터를 넣으면 안 된다.
- 서버가 여러 대일 경우 JWT가 Session보다 관리하기 편할 수 있다.
내일 학습 목표
1. Spring 숙련 미니 프로젝트 진행
- 프로젝트 구조 이해
- 계층 분리 연습
- 예외 처리 적용
- 인증/인가 적용 흐름 파악
2. N+1 문제 학습
- N+1 발생 원리 이해
- Lazy Loading 동작 방식 이해
- Fetch Join 활용
- Entity Graph 학습
- 실제 쿼리 로그 분석
회고
오늘은 Spring Bean 관리 방식과 인증/인가, Session, JWT까지 백엔드 개발에서 매우 중요한 개념들을 학습했다.
특히 단순히 "JWT를 사용한다" 수준이 아니라 왜 사용하는지, Session과 어떤 차이가 있는지 이해하게 된 점이 가장 큰 수확이었다.
내일은 N+1 문제와 Spring 숙련 미니 프로젝트를 통해 JWT와 Spring의 동작 원리를 더 깊게 이해하는 것을 목표로 학습을 이어갈 예정이다.
'부트캠프 > TIL(Today I Learned)' 카테고리의 다른 글
| [내일배움캠프 사전캠프_단기심화_8기]_영속성 컨텍스트 및 그 외 TIL (0) | 2026.06.27 |
|---|---|
| [내일배움캠프_단기심화_8기]_Days-5-TIL (0) | 2026.06.26 |
| [내일배움캠프_단기심화_8기] Days 4 TIL (Today I Learned) (0) | 2026.06.25 |
| [내일배움캠프 사전캠프_단기심화_8기]_Day 2 TIL (0) | 2026.06.23 |
| [내일배움캠프 사전캠프_단기심화_8기]_Day 1 오늘의 학습 키워드 (0) | 2026.06.22 |