관리 메뉴

bright jazz music

blog 26 : 가장 기본적인 요청 인증값 확인 본문

Projects/blog

blog 26 : 가장 기본적인 요청 인증값 확인

bright jazz music 2023. 2. 8. 22:31

서버 입장에서는 들어온 요청의 인증 여부만 확인하여 인증이 된 요청이라면 API를 사용하도록 해주면 된다.

 

- 새로운 기능을 추가할 때 과거에 작성한 코드가 맘에 들지 않을 수 있다. 그럴 때는 현재 내가 작성하려는 기능을 거기에 덧붙이지 말고, 과거의 코드를 리팩토링 한 뒤에 추가하는 버릇을 들이자. 그렇지 않는다면 레거시 코드로 남는 것이다. 리팩토링은 시간을 내서 하는 것이 아니다.

 

인증을 하는 방법

   //PostControllerTest.java
   
   @Test
    @DisplayName("글 작성 요청시 DB에 값이 저장된다.")
    void test3() throws Exception {
        //given
        PostCreate request = PostCreate.builder()
                .title("제목입니다.")
                .content("내용입니다.")
                .build();

//        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(request);

        //현재는 아무나 이런 요청을 전송할 수 있다. 인증을 추가해야 한다.
        mockMvc.perform(post("/posts")
                        .contentType(APPLICATION_JSON)
                        .content(json)
                )
                .andExpect(status().isOk())
                .andDo(print());

        //then
        assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치

        //DB에 잘 들어갔는지 확인
        Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
        assertEquals("제목입니다.", post.getTitle());
        assertEquals("내용입니다.", post.getContent());
    }

 

//인증 방법
//1. GET Parameter
//2. POST(body) value : 사용하지 않을 예쩡. PostCreate에 인증 코드를 추가해야 해서 설계가 무너진다. private String authrozation 같은.
//3. Header로 받는 방법

 

1. get parameter 방식 : 

리소스를 식별하기 위한 주소에 그 의도와 맞지 않는 값(RequestParam)이 들어가게 되어 잘 사용하지 않는다.

    
    //PostController.java
    @PostMapping("/posts")
    public void post(@RequestBody @Valid PostCreate request, @RequestParam(required = true) String authorization) { //기본값이 true
        // @RequestParam은 기본값이 true . 생략가능
        
        if (authorization.equals("catnails")){
            request.validate(); //검증

            postService.write(request);
        }
        
    }

 

 

//PostControllerTest.java

  @Test
    @DisplayName("글 작성 요청시 DB에 값이 저장된다.")
    void test3() throws Exception {
        //given
        PostCreate request = PostCreate.builder()
                .title("제목입니다.")
                .content("내용입니다.")
                .build();

//        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(request);
        String requestParam = "catnails";
        //현재는 아무나 이런 요청을 전송할 수 있다. 인증을 추가해야 한다.
        mockMvc.perform(post("/posts?authorization={auth}", requestParam)
                        .contentType(APPLICATION_JSON)
                        .content(json)
                )
                .andExpect(status().isOk())
                .andDo(print());

        //then
        assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치

        //DB에 잘 들어갔는지 확인
        Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
        assertEquals("제목입니다.", post.getTitle());
        assertEquals("내용입니다.", post.getContent());
    }




//////////////////
MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /posts
       Parameters = {authorization=[catnails]}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
             Body = {"title":"제목입니다.","content":"내용입니다."}
    Session Attrs = {}

 

2. POST(body) value

사용하지 않을 예정. 

PostCreate에 인증 코드를 추가해야 해서 설계가 무너진다. private String authrozation 같은 필드가 추가되면 PostCreate를 사용하는 다른 코드에서도 수정해 줘야할 필요가 생길 수도 있다..

 

3. header로 인증하는 방법

RequestParam 대신 RequestHedear로 받는다.

 

//PostController.java
    @PostMapping("/posts")
    public void post(@RequestBody @Valid PostCreate request, @RequestHeader(required = true) String authorization) {
        if (authorization.equals("catnails")){
            request.validate(); //검증

            postService.write(request);
        }

 

 @Test
    @DisplayName("글 작성 요청시 DB에 값이 저장된다.")
    void test3() throws Exception {
        //given
        PostCreate request = PostCreate.builder()
                .title("제목입니다.")
                .content("내용입니다.")
                .build();

//        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(request);
        String requestHeader = "catnails";

        mockMvc.perform(post("/posts")
                        .header("authorization", requestHeader)
                        .contentType(APPLICATION_JSON)
                        .content(json)
                )
                .andExpect(status().isOk())
                .andDo(print());

        //then
        assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치

        //DB에 잘 들어갔는지 확인
        Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
        assertEquals("제목입니다.", post.getTitle());
        assertEquals("내용입니다.", post.getContent());
    }
    
    
    /////////////
    
    MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /posts
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", authorization:"catnails", Content-Length:"57"]
             Body = {"title":"제목입니다.","content":"내용입니다."}
    Session Attrs = {}

Handler:
             Type = com.endofma.blog.controller.PostController
           Method = com.endofma.blog.controller.PostController#post(PostCreate, String)

 

이러한 방식이 가장 기본적인 인증방식이다. 물론 취약하긴 하다.

 

문제는 이런 식으로 여러 개 API에 코드를 추가하기가 번거롭다는 것이다.

따라서 다음 포스팅에서는 interceptor를 사용하여 모든 api에 적용될 수 있는 인증방식을 사용한다.

Comments