1. MockMvc 란?

MockMvc는 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.

 

2. MockMvc 사용법

get 방식으로 /post를 요청 시 Hello world가 출력되는 controller를 테스트한다고 가정.

Controller 단

@RestController
public class PostController {

    @GetMapping("/posts")
    public String get(){
        return "Hello world";
    }

}

Test 단

@WebMvcTest
class PostControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @DisplayName("/posts 요청시 Hello World를 출력한다.")
    void test() throws Exception {
        //expected
        mockMvc.perform(get("/posts"))   		//get방식으로 /posts로 요청을 보냄
                .andExpect(status().isOk())		//응답 status를 ok로 테스트
                .andExpect(content().string("Hello world"))	//반환된 응답값을 확인
                .andDo(print());				//응답값 print

    }
}

3. MockMvcRequestBuilders

  • GET/POST/PUT/DELETE 요청 방식과 매핑되는 메서드들을 제공
  • HTTP 요청 관련 정보(파라미터, 헤더, 쿠키 등)를 설정
메서드 명 설명
param / params 요청 파라미터를 설정한다.
header / headers 요청 헤더를 설정한다. contentType이나 accept와 같은 특정 헤더를 설정할 수 있는 메서드도 제공한다.
cookies 쿠키를 설정한다.
content 요청 본문을 설정한다.
contentType 본문 타입을 설정한다.
requestAttr 요청 스코프에 객체를 설정한다.
flashAttr 플래시 스코프에 객체를 설정한다.
sessionAttr 세션 스코프에 객체를 설정한다.
@Test
@DisplayName("MockMvcRequestBuilders 메서드")
void MockMvcRequestBuilders() throws Exception{
    mockMvc.perform(get("/mockMvcRequestBuilders")
            .param("testParam","test")  // name, values
            .content("Json으로")
            .contentType(APPLICATION_JSON)
    );
}

4. MockMvcResultHandlers

  • andDo() 메서드를 이용하여 실행결과를 출력
메서드 명 설명
log() 실행결과를 디버깅 레벨로 출력
print() 실행결과를 지정해준 대상으로 출력
@Test
@DisplayName("/posts 요청시 Hello World를 출력한다.")
void test() throws Exception {
    //expected
    mockMvc.perform(get("/posts"))
            .andExpect(status().isOk())
            .andExpect(content().string("Hello worlds"))
            .andDo(print())
            .andDo(log());

}

5.MockMvcResultMatchers

  • 응답에 대한 검증을 해줌. andExpect()
메서드 명 설명
status 상태 코드 검증
content 응답 본문 검증
view 컨트롤러가 반환한 뷰 이름 검증
@Test
@DisplayName("/posts 요청시 Hello World를 출력한다.")
void test() throws Exception {
    //expected
    mockMvc.perform(get("/posts"))
            .andExpect(status().isOk())
            .andExpect(content().string("Hello worlds"))
            .andExpect(view().name("viewName"))
            .andDo(print());

}
$ docker pull vault
//dev 용으로 inmemory 저장방식
$ docker run --name devVault --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN=myroot' -p \
					8200:8200 vault 

//volumn 바인딩을 해줘야 도커를 꺼도 데이터가 저장됨
$ sudo docker run --name vault -d --cap-add=IPC_LOCK -p 8200:8200 --log-opt \
            mode=non-blocking -v /vault/config:/vault/config \
            -v /vault/file:/vault/file -v /vault/logs:/vault/logs vault server

AWS 서버의 퍼블릭 주소 http://~~~~~~:8200 으로 접속

로그인 창이 뜨면 Method를 Token으로 선택하고, 앞서 컨테이너 생성시 설정한 루트 토큰 아이디를 입력한다.(myroot)

 

Secret 작성

로그인 후 Enable new engine을 클릭한다.

Generic > KV를 선택하고 Next 버튼을 클릭합니다.

Path에 원하는 Path를 작성하고 versions은 2로 설정한 후 Enable Engine을 클릭한다.

(이런식으로 Secret Engine을 생성해도 되지만 나는 그냥 기존에 있던 secret에다가 작업함)

Secret Engine(secret)에 들어가서 Create secret버튼을 클릭합니다.

Json을 클릭하고 Path for this secret에 원하는 경로를 작성한 후 application, yml에서 숨기고자 하는 내용들을 json 형식으로 작성 후 Save 버튼 클릭한다.

secret_auth가 생성된 후 Create new version을 클릭해서 Version2 로 변경한다.

Policy 작성

상단 메뉴에서 Policies를 클릭하고, Create ACL policy를 클릭한다.

Name에 Policy명(auth_acl)을, Policy에는 권한 내용을 작성하고 Create policy 버튼을 클릭한다.

앞에서 작성한 Secrets에 대한 권한 → https://www.vaultproject.io/docs/concepts/policies
 

Policies | Vault by HashiCorp

Policies are how authorization is done in Vault, allowing you to restrict which parts of Vault a user can access.

www.vaultproject.io

path "secret/*" {
  capabilities = ["list"]
}

path "secret/data/secret_auth" {
  capabilities = ["read","list"]
}
Userpass를 생성하고 나서 생성한 user로 로그인했을 때 Policy에 권한이 없다고 할때 보면 좋은 사이트 
https://stackoverflow.com/questions/54608202/how-to-get-hashicorp-vault-policy-right
 

How to get HashiCorp Vault policy right?

Here is the situation: I created an user vault write auth/userpass/users/'username' password='password' policies=default with default policy and added path "secret/db_pass/*" { capabilities...

stackoverflow.com

Authentication Methods 작성

상단 메뉴에서 Access를 클릭하고, Enable new method버튼을 클릭한다.

Generic > Username & Password를 선택하고 Next 버튼을 클릭한다.

생성한 userpass에서 Create user버튼을 클릭한다.

Username과 Password는 자유롭게 입력하고, 아래 Generated Token’s Policies에 앞서 작성한 Policy명(auth_acl)을 입력한 후 save 버튼을 클릭한다.

로그아웃한 후 앞서 생성한 Username & Password 정보로 로그인한다.

우측 상단의 사용자 정보 드롭다운을 클릭하고 Copy token을 클릭한다.

앞에서 myroot일때 생성한 Secret가 들어와있는걸 확인할 수 있다.

secret 목록을 클릭하고 들어왔을 때 You do not have permission to read this secret라고 뜨면 앞에 Policy에서 권한을 잘못 준 것이므로 수정해야 함.

저렇게 Secret > secret_auth가 나오면 OK

secret_auth를 클릭했을 때도 json형식으로 저장한 데이터가 잘 나오면 OK

 

** dev용 vault 방식이라서 docker stop vault를 하면 데이터가 다 지워지므로 volumn 바인딩을 해줘야 함

 

* 참고한 사이트

https://logical-code.tistory.com/183

 

[Spring Cloud Config] 설정값을 외부에서 관리하자! - 실습

앞선 포스트 기본편에서 이어집니다! [Spring Cloud Config] 설정값을 외부에서 관리하자! - 기본 시작하기 전에 스프링 또는 스프링 부트 개발을 하다 보면 *.properties 혹은 *.yml로 관리되는 환경설정

logical-code.tistory.com

https://velog.io/@limsubin/Vault-관리자-화면을-시작-및-간단한-테스트를-해보자

 

Vault 관리자 화면을 시작 및 간단한 테스트를 해보자!

vault : v1.10.0📌 Vault를 Docker로 올려보자!비상 시 필요한 마스터 키의 초기 세트를 설정Key shares : 총 key 수 설정Key threshold : 몇 개 이상의 key를 보유해야 login이 가능한지 설정저는 테스트를 위해 각

velog.io

'개발' 카테고리의 다른 글

Vault란  (0) 2022.07.19

* Vault란?

  • ID 기반 비밀 및 암호화 관리 시스템
  • 비밀은 공개되면 안되는 API 암호화키, 암호 또는 인증서와 같이 액세스를 엄격하게 제어하려는 모든 것
  • Vault는 인증 및 권한 부여 방법으로 차단되는 암호화 서비스를 제공

* 주요 기능

1. Secure Secret Storage

  • Vault에 임의의 키/값 비밀을 저장, Vault는 이러한 비밀을 영구 저장소에 쓰기전에 암호화하므로 원시 저장소에 대한 액세스 권한을 얻는 것만으로는 비밀에 액세스할 수 없다.

2. Dynamic Secrets

  • AWS 또는 SQL 데이터베이스와 같은 일부 시스템에 대해 온디맨드로 비밀을 생성할 수 있다.

3. Data Encryption

  • 데이터를 저장하지 않고 암호화 및 해독할 수 있습니다. 이를 통해 보안 팀은 암호화 매개변수를 정의하고 개발자는 자체 암호화 방법을 설계하지 않고도 SQL 데이터 베이스와 같은 위치에 암호화된 데이터를 저장할 수 있승비다.

4. Leasing and Renewal

  • 모든 비밀에는 관련 임대가 있습니다. 임대 기간이 끝나면 Vault는 해당 비밀을 자동으로 취소한다.

5. Revocation

  • 키 롤링과 침입 시 시스템 잠금을 지원한다.

* Vault docker 설치하기

1)  최신 vault 도커 이미지를 가져옴

$ docker pull vault
//또는
$ sudo docker pull vault

2) Host PC에 사용할 디렉토리를 만듬

$ sudo mkdir /vault/logs   -> 로그를 저장할 디렉토리
$ sudo mkdir /vault/files  -> 데이터를 저장할 디렉토리
$ sudo mkdir /vault/config -> 설정 디렉토리(HCL 또는 JSON 형태 파일)

3) 설정파일을 만듬

  • local.json 파일을 만들어 /vault/config 디렉토리로 복사, backend 데이터 저장소로 /vault/file 디렉토리를 사용
  • TTL(Time To Live = Duration)은 초 단위로 지정 및 표시, 시간으로 지정하고자 하는 경우 “h”를 붙여 문자열로 기입함
  • 프로젝트 성격과 보안 정책에 따라 기본 Lease TTL는 168시간(7일), 최대 Lease TTL은 720시간(30일)값을 설정할 수 있음
  • 참고로 Vault는 Eternity(token_duration) 영원히 유지되는 토큰은 Root Token만 지원 일반 Token은 TTL이 존재함, 만약 0으로 설정시 기본 32일(2,764,800초)로 설정됨
{
   "listener":{
      "tcp":{
         "address":"0.0.0.0:8200",
         "tls_disable":1
      }
   },
   "backend":{
      "file":{
         "path":"/vault/file"
      }
   },
   "default_lease_ttl":"876000h",   //100년
   "max_lease_ttl":"876000h",
   "ui":true,
   "log_level": "trace"
}
https://www.vaultproject.io/docs/configuration
자세한 설정 정보는 위의 링크 참고

4) docker 컨테이너를 실행

  • Vault의 8200번 포트를 외부에 열고 설정, backend 데이터, 로그 디렉토리를 Host 디렉토리와 연결
  • 옵션 중 —cap-add=IPC_LOCK은 강력하게 권장되는 옵션, IPC(Inter Process Communication)을 잠그는 것으로 메모리 스왑 공격으로부터 보호함 데몬실행 후 로깅할 때 콘솔을 계속 잡고있지 않도록 논블록킹으로 설정 —log-opt mode=non-blocking
//dev 용으로 inmemory 저장방식
$ sudo docker run --name devVault --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN=myroot' -p \
					8200:8200 vault 
                    
//volumn 바인딩을 해줘야 도커를 종료해도 데이터가 저장됨
$ sudo docker run --name vault -d --cap-add=IPC_LOCK -p 8200:8200 --log-opt mode=non-blocking \
            -v /vault/config:/vault/config \
            -v /vault/file:/vault/file \
            -v /vault/logs:/vault/logs vault server
  • docker logs 명령의 -f 옵션을 이용해서 위에서 만든 컨테이너의 로그들을 백그라운드모드로 stdout.log 파일에 기록합니다.
  • 리눅스는 가장 마지막에 &를 붙이면 백그라운드에서 실행하겠다는 의미
  • 2>&1 옵션은 stdout은 1, stderr은 2인데 stderr도 stdout으로 추가로 보내겠다는 의미 결국 stdout과 stderr 모두 남김없이 mystd.log 파일에 남기라는 의미
//리눅스인 경우
$ sudo chmod 777 /vault/logs
$ sudo docker logs -f vault >> /vault/logs/mystd.log 2>&1 &
$ tail -f /vault/logs/mystd.log

* 참고한 사이트

https://velog.io/@limsubin/Vault를-Docker로-올려보자

 

Vault란 ? vault를 Docker로 올려보자!

vault :v1.10.0OS : CentOS Linux release 7.8.2003(Core)Docker : 19.03.13ID 기반 비밀 및 암호화 관리 시스템비밀은 공개되면 안되는 API 암호화 키, 암호 또는 인증서와 같이 액세스를 엄격하게 제어하려는 모든 것

velog.io

'개발' 카테고리의 다른 글

Vault 설정하기(AWS EC2)_dev용  (0) 2022.07.19

+ Recent posts