티스토리 뷰

[Auth] 인증과 인가

인증과 인가

  • 인증(Authentication): 로그인 기능, 인증된 사용자인지 확인하는 것
  • 인가(Authorization): 사용 권한이 있는지 확인하는 것

쿠키, 세션, 토큰

  • 쿠키는 클라이언트 측의 저장소이다. 쿠키에 저장이 되면 쿠키는 서버 요청시마다 보내지게 된다. 탈취될 위험이 있어 보안적으로 중요한 내용은 저장하지 않는 편이다.
  • 세션을 통한 인증은 서버측에서 세션저장소에 사용자를 등록하고 이것을 sessionId 값으로 관리한다. 클라이언트에 세션아이디를 알려주고 클라이언트는 세션아이디를 서버에 보내 사용자를 확인한다. 서버는 세션아이디를 가지고 세션저장소에서 인증정보를 확인한다. 사용자가 많아진다면 서버의 세션저장소의 부하가 발생한다.
  • 서버는 토큰을 로그인한 사용자에 대해 발급한다. 이것은 대칭키 혹은 비대칭키로 암호화 된다. 클라이언트는 토큰을 인증정보가 필요할 때마다 보내고 서버에서는 약속된 방식으로 복호화하여 해당 정보가 있는지 확인하여 인증을 관리한다.

태그

  • 인증, 인가, 쿠키, 세션, 토큰

[Spring] MVC Config

ViewControllers

  • 정적 페이지를 보여주기 위한 페이지 매핑이 가능
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

HandlerInterceptor

  • 들어오는 요청에 대해 인터셉터를 등록가능
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

HandlerMethodArgumentResolver

  • 주어지는 요청(파라미터)에 대해 어떤 방식으로 처리할지 등록할 수 있는 인터페이스
public interface HandlerMethodArgumentResolver {

    boolean supportsParameter(MethodParameter parameter);
    // 조건 확인

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
    // 조건에 해당(true)하면 수행할 로직
}

태그

  • Spring, MVC Config

[Spring] Auth

Session

  • HttpSession은 Controller 메서드에 바로 주입(DI)이 가능
  • ServletRequestAttribute에서 HttpSession을 직접 가져올 수도 있음

태그

  • Spring, HttpSession

[Spring] Configuration

Java-based Container Configuration

  • @Configuration 어노테이션으로 설정 파일을 관리할 수 있다.
  • 이 경우에는 메소드에 @Bean 어노테이션으로 빈 등록이 가능
  • Spring IoC container 에서 빈 관리가 가능
  • @Bean 으로 등록된 객체는 서로 주입이 가능
@Configuration
public class AppConfig {

    @Bean
    public BeanOne beanOne() {
        return new BeanOne(beanTwo());
    }

    @Bean
    public BeanTwo beanTwo() {
        return new BeanTwo();
    }
}

@PropertySource

  • PropertySource를 스프링 환경에 쉽게 가져올 수 있게 하는 어노테이션
  • 경로를 지정해주면 해당 파일을 환경설정에 적용가능
  • ${...} 를 사용하여 경로를 변수처럼 설정 가능

@Value

  • 외부의 properties를 주입이 가능하게 하는 어노테이션
  • Config에서 @PropertySource("경로") 에서 해당하는 항목을 가져올 수 있다.
  • @Value("${[catalog.name](http://catalog.name)}") 이면 Config에서 설정한 property 파일의 catalog.name 항목을 가져오게 된다.
  • property 파일에서 읽을 수 없다면 값 자체로 주입되게 된다.
  • 없는 경우를 좀 더 강력하게 관리하고 싶다면 PropertySourcesPlaceholderConfigurer을 Configuration 클래스의 static 메소드로 빈등록을 해주어야 한다.

태그

  • Spring, Configuration

[Spring] DispatcherServlet

DispatcherServlet

  • 디자인패턴의 FrontController이다.

이미지출처: https://docs.spring.io/spring-framework/docs/3.0.0.RC3/spring-framework-reference/html/ch15s02.html

  • 스프링 공식문서
  • HttpServlet을 상속하는 실질적인 Servlet이다.
  • Servlet이란 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.
  • 각 DispatcherServlet은 고유한 WebApplicationContext를 가지며 이것은 root WebApplicationContext에서 정의된 모든 빈을 상속한다.

이미지 출처: https://docs.spring.io/spring-framework/docs/3.0.0.RC3/spring-framework-reference/html/ch15s02.html

  • WebApplicationContext는 기본 ApplicationContext에서 웹에 필요한 추가적 특징을 가져 확장된 것이다.
  • WebApplicationContext의 특별한 빈들: controller, handlerMappings, viewResolvers, localeResolver, themeResolver, multipartFileResolver, handlerExceptionResolvers

태그

  • Spring, Servlet, DispatcherServlet

[Security] 대칭키, 비대칭키

대칭키

  • 하나의 키로 암호화와 복호화를 진행
  • 속도가 빠름
  • 키 분배가 필요

비대칭키

  • 암호화하는 키와 복호화하는 키가 다름
  • public key, private key를 가지는 pair key를 사용하여 암호화와 복호화를 함 (많은 경우 공개치로 암호화하고 개인키로 복호화를 진행)
  • 속도가 느림
  • 암호화만 하는 곳에서는 공개키로 암호화만 하면 되고, 개인키로 복호화하여 평문을 볼 수 있게 됨

태그

  • 대칭키, 비대칭키

[Auth] JWT

JWT

이미지출처: https://velopert.com/2389

  • 헤더
    • 토큰 타입
    • 해싱 알고리즘
  • payload
    • 정보
    • 정보의 한 조각을 claim이라고 함
    • 보통 만료시간과 생성시간을 넣어 내용이 중복되지 않게 만듦
  • signature
    • 헤더의 값과 payload의 값을 합친뒤 비밀키로 해싱하여 생성
    • 헤더와 내용이 같으면 서명이 같아질 수 밖에 없지만, 생성시간과 만료시간 등을 넣어 내용이 일치하지 않게 만듦

태그

  • JWT

1-1 학습로그

[Test] Service Test

Service layer Test

  • Mock
    • Mockito 사용가능
    • @ExtendWith(MockitoExtension.class)로 Mockito 환경설정
    • @InjectMocks로 mock 객체를 주입할 클래스를 설정
    • @Mock로 mock 으로 사용할 클래스를 설정
    • given(~~~).willReturn()으로 어떠한 mock 객체 메소드 실행시 리턴값 설정가능
  • TestFixture
    • @SpringBootTest로 스프링에 등록된 빈을 가져와서 사용 가능
    • @ActiveProfiles("test")로 테스트 환경설정 가능
    • TestEnvironment
    • @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    • 기본 테스트 환경은 MOCK 으로 내장톰캣을 구동하지 않고 mocking 한 컨테이너가 뜬다.
    • RANDOM_PORT, DEFINED_PORT: 내장톰캣을 구동
    • @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
    • 스프링 환경을 새롭게 하는 어노테이션으로 ClassMode, MethodMode 를 설정할 수 있다.

태그

  • 서비스레이어 테스트

[Spring] 환경설정

환경설정

  • -test 등으로 환경 설정 파일을 다르게 줄 수 있음
  • @Profiles("~~") 해당 설정파일에 해당될 경우에만 빈으로 등록됨
  • @ActiveProfiles("test") 테스트할 경우 프로파일을 설정 가능
  • 특정 설정이 없다면 기본으로는 application.properties 또는 application.yml이 기본 설정 파일으로 잡힘

태그

  • 스프링, 환경설정
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함