-
2022-07-28 : SpringTIL ( 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