TIL - 26.01.22

이준연·2026년 1월 22일

학습 키워드


  • 인증 & 인가 개념 정리
  • Spring Security 개념 및 구조

인증 & 인가


인증이란?

개념

  • 사용자의 신원을 확인하는 절차
  • 클라이언트가 자신이 누구인지 증명
  • 아이디/비밀번호, 토큰, 인증서 등 다양한 방식 사용

예시

  • 로그인 시 아이디/비밀번호 입력 → DB 조회 → 일치 시 인증 성공
  • JWT 토큰 헤더에 포함 → 토큰 유효성 검증 → 인증 성공

결과

  • 인증에 성공 시, 사용자 정보보안 컨텍스트에 저장
  • 해당 정보를 바탕으로 이후 요청 처리 시 누가 요청했는지 판단

인가란?

개념

  • 인증된 사용자가 요청한 리소스나 기능에 접근할 권한이 있는지 판단
  • 역할, 권한에 따라 접근 여부 결정

예시

  • 관리자만 접근 가능한 페이지 → 일반 사용자는 접근 차단
  • 특정 게시물은 작성자만 수정 가능 → 다른 사용자는 403 Forbidden

결과

  • 인가 실패 시 403 Forbidden
  • 인가 성공 시 요청 처리 진행

인증 & 인가 흐름

  • 클라이언트 → 요청 → 서버 → 인증 → 인가 → 요청 처리/차단

Spring Security


Spring Security란?

인증과 인가를 담당하는 보안 프레임워크

주요 특징

  • Filter 기반 보안 처리
  • 인증/인가 로직 구조 제공
  • 인증 방식을 플러그인 형태로 확장

의존성

implementation 'org.springframework.boot:spring-boot-starter-security'

Spring Security 흐름

기본 흐름

  • 클라이언트 → 요청 → Security Filter Chain → AuthenticationManager → AuthenticationProvider → UserDetailsService
    → User 저장 및 인증 처리

로그인 요청 흐름 예시

  1. 아이디/비밀번호 입력
  2. Filter Chain 이 요청을 가로챔
  3. AuthenticationManager 으로 인증 위임
  4. UserDetailsService 에서 사용자 조회
  5. 비밀번호 일치 → 인증 성공 → SecurityContext에 저장
  6. 인증 실패 → 로그인 페이지로 리다이렉트

JWT 인증 방식 도입 시 흐름

  • 클라이언트 → 요청 → JwtFilter → Security Filter Chain → User 저장 및 인증 처리

JWT 인증 흐름 요약

  1. 아이디/비밀번호 입력
  2. 인증 성공 시 토큰 생성 → 클라이언트에 반환
  3. 이후 모든 요청에 Authorization: Bearer {JWT} 헤더 포함
  4. 커스텀 필터 JwtFilter가 토큰 유효성 검사
  5. 유효한 경우 → Authentication 생성 → SecurityContext에 저장
  6. 이후 인가 절차로 넘어감

커스텀 JwtFilter 등록 예시

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .csrf(AbstractHttpConfigurer::disable)  // .csrf().disable() 방식은 더 이상 사용 안함.
            .httpBasic(AbstractHttpConfigurer::disable) // BasicAuthenticationFilter 비활성화
            .formLogin(AbstractHttpConfigurer::disable) // UsernamePasswordAuthenticationFilter, DefaultLoginPageGeneratingFilter 비활성화
            .addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class)
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/login").permitAll()
                .anyRequest().authenticated()
            )
            .build();
    }
  • crsf : CSRF(Cross-Site Request Forgery) 보호를 비활성화

    • Why :: JWT 기반 인증에서는 crsf가 필요하지 않으니 비활성화
  • httpBasic : HTTP Basic 인증 방식을 비활성화

    • Why :: Authorization 헤더에 사용자 이름과 비밀번호를 평문으로 포함하는 방식으로, 현대적인 애플리케이션에서는 보안의 문제로 잘 사용하지 않음
  • formLogin : 기본 로그인 폼과 관련된 필터를 비활성화

  • addFilterBefore : 필터의 순서를 지정해주는 역할

    • .addFilterBefore(jwtFilter, SecurityContextHolderAwareRequestFilter.class)
    • jwtFilter 뒤에 SecurityContextHolderAwareRequestFilter 를 위치 시킬 것 이다.
  • authorizeHttpRequests

    • 어디에 어떻게 권한 검사를 할 것인지에 대한 구체적인 내용을 작성
.authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/login").permitAll()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .requestMatchers("/api/user/**").hasRole("USER")
profile
반갑습니다!

0개의 댓글