ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-07-28 : Spring
    TIL ( Today I Learned ) 2022. 7. 28. 15:37

    1. Environment

    : 스프링 환경이자 설정과 관련된 인터페이스, 설정 값을 변경하는 건 불가능하고 접근해서 값을 가져올 수만 있다.

     

    - ( 구글에 검색하면 Environment 의 동의어로 Setting이 있다 )

    - ( ConfigurableEnvironment 인터페이스로 캐스팅하여 설정 값을 추가할 순 있지만 Environment 인터페이스로는 불가능 )

     

    ApplicationContext 의 또 다른 기능

    - Environment는 ApplicationContext의 또 다른 기능이다

    public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,
    		HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher,ResourcePatternResolver{
    	// ...
    }

    - ApplicationContext 인터페이스를 보면 위와 같다

    - 그 중에 EnvironmentCapable 라는 인터페이스를 부모 인터페이스로 두고 있는 것을 확인할 수 있는데 이거 ApplicationContext가 DI 관점에서 기능 외의 또 다른 기능인 Environment의 기능을 갖는다.

    public interface EnvironmentCapable {
        Environment getEnvironment();
    }

    - 위에서 설명한 EnvironmentCapable 인터페이스

    - Profiles 설정과 Property 설정에 접근하는 Environment 확인해보자

     

    Profiles

    - Profiles은 스프링 웹 애플리케이션을 개발할 때, 애플리케이션 환경에 따라 약간씩 변경이 되어야할 설정 값들을 코드의 변경 없이 설정만으로 편리하게 변경할 수 있는 제공하는 인터페이스이자 분리의 기준

    spring:
      profiles:
        active: prod # 어떤 Profiles를 기준으로 설정값을 활성화시킬건지 설정
    
    ---
    spring:
      profiles: dev # develope 환경일 때 아래 설정을 활성화
      datasource:
        url: jdbc:h2:mem:testdb
        driver-class-name: org.h2.Driver
        username: sa
        password: password
      jpa:
        database-platform: org.hibernate.dialect.H2Dialect
        hibernate:
          ddl-auto: create
      h2:
        console:
          enabled: true
    
    ---
    spring:
      profiles: prod # product 환경일 때 아래 설정 활성화
      datasource:
        url: jdbc:mysql://111.222.0.111:3306/office?serverTimezone=UTC&characterEncoding=UTF-8
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: jdk
        password: jeongpro
      jpa:
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
        hibernate:
          ddl-auto: update
    출처: https://jeong-pro.tistory.com/223 [기본기를 쌓는 정아마추어 코딩블로그:티스토리]

    - 개발환경(dev)에서는 h2메모리 데이터베이스, 실제 제품환경(prod)에서는 mysql 설정을 따른다.

     

    @Profile

    - @profile로 profiles 설정에 따라 빈은 생성하고 안하고를 결정할 수 있다.

     

    Environment.acceptsProfiles(Profile...)

     

    PropertyResolver

    - Environment 인터페이스는 부모 인터페이스로 PropertyResolver를 갖고 있다

    - 이 인터페이스에서 프로퍼티에 접근하게 해주기에 Environment에서도 프로퍼티에 접근할 수 있다

    - environment의 getProperty() 메소드를 통해서 프로퍼티 값에 접근가능

     

    참고 자료 : https://jeong-pro.tistory.com/223

     

    2. @PostConstruct

    : 의존성 주입이 이루어진 후 초기화를 수행하는 메서드이다. @PostConstruct가 붙은 메서드는 클래스가 service를 수행하기 전에 발생한다. 이 메서드는 다른 리소스에서 호출되지 않는다해도 수행된다.

     

    - 사용이유

    1. 생성자가 호출되었을 때, 빈은 초기화되지 않았음( 의존성 주입이 이루어지지 않았음 )

        ㆍ이럴 때 @PostConstruct를 사용하면 의존성 주입이 끝나고 실행됨이 보장되므로 빈의 초기화에 대해 걱정 X

    2. bean의 생애주기에서 오지 한 번만 수행된다는 것을 보장

        ㆍ애플리케이션이 실행될 떄 한번만 실행됨

        ㆍbean이 여러 번 초기화되는 걸 방지할 수 있다.

     

    3. JWT

    JWS 만들기

    1. Jwts.builder() 메서드를 사용해서 인스턴스 JwtBuilder를 만든다

    2. JwtBuilder 원하는 대로 헤더 매개변수와 클레임을 추가하는 메서드를 호출

    3. JWT에 서명하는데 사용할 SecretKey 또는 비대칭을 지정한다. - PrivateKey

    4. 마지막으로 compact() 메소드를 호출하여 압축하고 서명하여 최종 jws를 생성

    String jws = Jwts.builder()
    		.setSubject("Bob")
                    .signWith(key)	// 서명키
                    .compact();	// JWS 압축

     

    Claim

    : JWT의 본문이며, JWT작성자가 JWT 수신자에게 제공할려는 정보를 포함한다.

        ㆍsetIssuer : 발급자

        ㆍsetSubject : 주제

        ㆍsetAudience : 대상

        ㆍsetExpiration : 만료시간

        ㆍsetNotBefore : 이 시간 이전에는 토큰 처리 X

        ㆍsetIssueAt : 발급시점

        ㆍsetId : JWT ID

    String jws = Jwts.builder()
        .setIssuer("me")
        .setSubject("Bob")
        .setAudience("you")
        .setExpiration(expiration) //a java.util.Date
        .setNotBefore(notBefore) //a java.util.Date 
        .setIssuedAt(new Date()) // for example, now
        .setId(UUID.randomUUID()) //just an example id

     

    서명알고리즘 재정의

    : 특정 경우에 주어진 키에 대해 JJWT의 기본 선택 알고리즘을 재정의할 수 있다

    - 예를 들어 RSA PrivateKey가 2048비트인 경우 JJWT는 자동으로 RS256 알고리즘을 선택한다.

    .signWith(privateKey, SignatureAlgorithm.RS512) // <---
       
    .compact();

    - JJWT는 RS512키는 >= 4096비트를 선호하고, RS384 >= 3072비트, 마지막 RS256으로 키 >= 2048비트를 선호

     

    JWS 읽기

    1. Jwts.parserBuilder() 메서드를 사용하여 인스턴스 JwtParserBuilder를 만든다.

    2. JWS 서명을 확인하는 데 사용할 SecretKey 또는 비대칭을 지정 - PublicKey

    3. build() 에서 메서드를 호출하여 JwtParserBuilder 스레드로부터 secure 반환 - JwtParser

    4. 마지막으로 parseClaimsJws(String) jws String로 메소드를 호출하여 원본 JWS를 생성

    5. 구문 분석 또는 서명 유효성 검사가 실패한 경우 전체 호출이 try/catch 블록으로 래핑

    Jws<Claims> jws;
    
    try {
        jws = Jwts.parserBuilder()  // (1)
        .setSigningKey(key)         // (2) 동일한 SecretKey
        .build()                    // (3)
        .parseClaimsJws(jwsString); // (4)
        
        // we can safely trust the JWT
         
    catch (JwtException ex) {       // (5)
        
        // we *cannot* use the JWT as intended by its creator
    }

     

    참고자료 : https://github.com/jwtk/jjwt#jws-create

     

     

     

    'TIL ( Today I Learned )' 카테고리의 다른 글

    2022-08-01 : webpack & React  (0) 2022.08.01
    2022-07-29 : JAVA & Spring  (0) 2022.07.29
    2022-07-27 : 파일업로드 & buffer, 기타 등등  (0) 2022.07.27
    2022-07-26 : Git  (0) 2022.07.26
    2022-07-25 : JAVA  (0) 2022.07.25

    댓글

Designed by Tistory.