티스토리 뷰

반응형

스프링 시큐리티 완전 처음부터 11편 (Kotlin)

실무 투입 전 최종 체크리스트 + 바로 쓰는 템플릿 (이 글 하나면 다시 안 헤맨다)


이제 진짜 마지막이다.
11편은 새 개념을 추가하는 글이 아니라,
지금까지 만든 모든 걸 **“실무에서 바로 쓰게 만드는 정리 글”**이다.

솔직히 말해서
스프링 시큐리티는 한 번 이해해도
몇 달만 손 놓으면 다시 헷갈린다.

그래서 이 글은:

  • 프로젝트 시작할 때
  • 이직 과제할 때
  • 면접 전날
  • 실무에서 “우리 보안 구조 뭐지?” 싶을 때

👉 북마크해두고 다시 보는 글을 목표로 쓴다.


1️⃣ 전체 구조 한 번 더 리마인드 (머릿속 지도)

이 그림을 보고
아래 문장이 바로 떠오르면 성공이다.

“로그인은 인증,
이후 요청은 JWT 검증,
인가는 ROLE + tenant 기준”


2️⃣ 실무 투입 전 필수 체크리스트 (이거 안 하면 사고 난다)

✅ 인증(Authentication)

  • formLogin 제거했는가?
  • 로그인 API는 Filter에서 처리하는가?
  • UserDetailsService + PasswordEncoder 연결 확인
  • JWT 만료(exp) 설정되어 있는가?
  • secretKey를 환경변수로 관리하는가?

✅ 인가(Authorization)

  • URL 레벨 접근 제어 존재하는가?
  • Service 레벨에 @PreAuthorize 적용했는가?
  • ROLE prefix(ROLE_) 일관되게 쓰는가?
  • 관리자 로직이 Controller에만 있지 않은가?

✅ JWT

  • Payload에 최소 정보만 있는가?
    • username
    • role
    • (멀티 테넌트면) tenantId
  • 개인정보가 들어가 있지 않은가?
  • 토큰 검증 실패 시 SecurityContext 비워지는가?

✅ 멀티 테넌트 (해당 시)

  • JWT에 tenant 식별자 포함했는가?
  • Repository 쿼리에 tenant 조건 빠진 곳 없는가?
  • findAll() 남아 있지 않은가?
  • 테스트 데이터에 tenant 2개 이상 있는가?

3️⃣ “이 구조로 프로젝트 하나 시작한다면” 최소 템플릿

반응형

이건 진짜 실무용이다.
복붙해서 시작해도 되는 구조다.


📁 패키지 구조 추천

security
 ├── config
 │    └── SecurityConfig.kt
 ├── filter
 │    ├── CustomAuthenticationFilter.kt
 │    └── JwtAuthenticationFilter.kt
 ├── jwt
 │    └── JwtProvider.kt
 ├── principal
 │    └── TenantUserPrincipal.kt
 └── service
      └── CustomUserDetailsService.kt

👉 보안 코드는 한 패키지에 모아둔다.
이것만으로도 유지보수 난이도가 내려간다.


4️⃣ 실무에서 자주 쓰는 코드 조각 모음

✔ 현재 로그인 사용자 꺼내기

fun currentUser(): TenantUserPrincipal {
    val auth = SecurityContextHolder.getContext().authentication
    return auth.principal as TenantUserPrincipal
}

✔ 현재 tenantId 가져오기

fun currentTenantId(): Long =
    currentUser().tenantId

✔ 관리자 전용 서비스 메서드

@PreAuthorize("hasRole('ADMIN')")
fun adminOnlyLogic() {
    // 위험한 로직
}

✔ tenant + ROLE 동시에 체크

@PreAuthorize("hasRole('ADMIN') and #tenantId == principal.tenantId")
fun updateTenantConfig(tenantId: Long) { }

5️⃣ “이 구조, 언제까지 써도 되나요?”에 대한 현실적인 답

✔ 충분한 경우

  • 대부분의 스타트업
  • 내부 서비스
  • B2B SaaS
  • 관리자 시스템
  • 모바일/웹 서비스

❗ 재설계 고려 시점

  • 글로벌 서비스
  • SSO 필수
  • 대기업 연동
  • 감사/컴플라이언스 요구

그때는:

  • OAuth2 Authorization Server
  • Keycloak
  • Auth0
  • AWS Cognito

같은 외부 인증 서버를 붙인다.

👉 지금 구조는 “그 전까지 쓰는 정답”이다.


6️⃣ 이 시리즈를 끝까지 따라온 사람에게, 진짜로

여기까지 왔다는 건
단순히 글을 많이 읽었다는 게 아니다.

  • 인증/인가를 기능이 아니라 설계 문제로 보게 됐고
  • “왜 이렇게 했는지” 설명할 수 있고
  • 보안 사고 포인트를 미리 의식하게 됐다

이 차이는 생각보다 크다.


7️⃣ 이 시리즈를 이렇게 활용해도 좋다

  • ✔ 포트폴리오 “보안 설계” 섹션
  • ✔ 기술 블로그 연재
  • ✔ 사내 위키/온보딩 문서
  • ✔ 면접 대비 스크립트
  • ✔ 다음 프로젝트의 베이스 코드

🎯 마지막 한 문장

스프링 시큐리티는
외워서 쓰는 기술이 아니라,
구조를 이해하고 선택하는 기술이다.

여기까지 왔다면
당신은 이미 그 단계를 넘었다.


 

스프링시큐리티, springsecurity, 코틀린, kotlin, jwt, 인증인가, 보안설계, 백엔드개발, 실무시큐리티, 개발블로그

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
반응형