[데브코스] Spring Boot 인증·인가(Auth) (38~39강) - 글·댓글 인증/권한 테스트 케이스를 꼼꼼하게 추가한 이유

zuno·2026년 1월 13일

38강과 39강에서는 새로운 기능을 추가하지 않는다.
대신 이미 구현된 인증/인가 로직을 테스트로 단단히 고정한다.

두 강의의 성격이 거의 동일하기 때문에,
이번 글에서는 38강 + 39강을 한 번에 정리한다.


1️⃣ 이번 강의들의 공통 주제

이번 두 강의의 공통 주제는 명확하다.

“권한 체크는 반드시 테스트로 보장해야 한다.”

추가된 테스트는 전부 다음 범주에 속한다.

  • 인증 정보가 잘못된 경우
  • 권한이 없는 사용자가 요청한 경우

2️⃣ 38강: 글(Post)에 대한 인증/권한 테스트 추가

38강에서는 글 쓰기 / 글 수정 / 글 삭제에 대해
인증·권한 테스트가 추가된다.


✔ 글 쓰기 – 잘못된 Authorization 헤더

@Test
@DisplayName("글 쓰기, with wrong authorization header")
void t11() throws Exception {
    mvc.perform(
            post("/api/v1/posts")
                    .header("Authorization", "Bearer wrong-api-key")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content("""
                            {
                                "title": "제목",
                                "content": "내용"
                            }
                            """)
    )
    .andExpect(status().isUnauthorized())
    .andExpect(jsonPath("$.resultCode").value("401-3"))
    .andExpect(jsonPath("$.msg").value("API 키가 유효하지 않습니다."));
}

👉 인증 실패(401) 가 정확히 발생하는지 검증한다.


✔ 글 수정 – 권한 없는 사용자

@Test
@DisplayName("글 수정, without permission")
void t12() throws Exception {
    mvc.perform(
            put("/api/v1/posts/1")
                    .header("Authorization", "Bearer user3-api-key")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content("""
                            {
                                "title": "제목 new",
                                "content": "내용 new"
                            }
                            """)
    )
    .andExpect(status().isForbidden())
    .andExpect(jsonPath("$.resultCode").value("403-1"))
    .andExpect(jsonPath("$.msg").value("1번 글 수정권한이 없습니다."));
}

👉 인가 실패(403) 를 테스트로 고정한다.


✔ 글 삭제 – 권한 없는 사용자

@Test
@DisplayName("글 삭제, without permission")
void t13() throws Exception {
    mvc.perform(
            delete("/api/v1/posts/1")
                    .header("Authorization", "Bearer user3-api-key")
    )
    .andExpect(status().isForbidden())
    .andExpect(jsonPath("$.resultCode").value("403-2"))
    .andExpect(jsonPath("$.msg").value("1번 글 삭제권한이 없습니다."));
}

3️⃣ 39강: 댓글(PostComment)에 대한 권한 테스트 추가

39강에서는 동일한 패턴을 댓글 도메인에 그대로 적용한다.


✔ 댓글 수정 – 권한 없는 사용자

@Test
@DisplayName("댓글 수정, without permission")
void t6() throws Exception {
    mvc.perform(
            put("/api/v1/posts/1/comments/1")
                    .header("Authorization", "Bearer user3-api-key")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content("""
                            {
                                "content": "내용 new"
                            }
                            """)
    )
    .andExpect(status().isForbidden())
    .andExpect(jsonPath("$.resultCode").value("403-1"))
    .andExpect(jsonPath("$.msg").value("1번 댓글 수정권한이 없습니다."));
}

✔ 댓글 삭제 – 권한 없는 사용자

@Test
@DisplayName("댓글 삭제, without permission")
void t7() throws Exception {
    mvc.perform(
            delete("/api/v1/posts/1/comments/1")
                    .header("Authorization", "Bearer user3-api-key")
    )
    .andExpect(status().isForbidden())
    .andExpect(jsonPath("$.resultCode").value("403-2"))
    .andExpect(jsonPath("$.msg").value("1번 댓글 삭제권한이 없습니다."));
}

4️⃣ 왜 이런 테스트를 “꼼꼼하게” 만들어야 할까?

강의에서 계속 강조되는 이유가 있다.

🔹 유효성 검증 (Validation)

  • @Valid, @NotBlank, @Size
  • 프레임워크가 검증
  • 신뢰도가 매우 높음

👉 상대적으로 테스트 우선순위가 낮다.


🔹 권한 검증 (Authorization)

  • 개발자가 직접 조건을 작성
  • 실수할 가능성이 높음
  • 보안과 직결됨

👉 테스트가 없으면 위험하다.


5️⃣ 이번 테스트들의 진짜 역할

이 테스트들은 단순히 “에러가 난다”를 확인하는 게 아니다.

다음을 명확하게 보장한다.

  • 인증이 잘못되면 → 401
  • 인증은 맞지만 권한이 없으면 → 403
  • 글/댓글의 주인이 아니면 → 수정·삭제 불가
  • 에러 코드와 메시지가 정확하다

👉 권한 정책이 테스트로 문서화된 셈이다.


6️⃣ 36강 리팩토링과의 연결

36강에서 했던 작업을 떠올려보자.

  • 권한 체크 로직을 컨트롤러 → 엔티티로 이동
  • checkActorCanModify, checkActorCanDelete 도입

이번 38~39강 테스트는

“이 엔티티 권한 로직이 실제로 제대로 동작하는가?”

를 검증하는 단계다.


7️⃣ 이 흐름이 좋은 이유

지금 구조는 다음 순서로 완성된다.

  1. Rq에서 인증(Authentication)
  2. 엔티티에서 인가(Authorization)
  3. 테스트에서 실패 케이스 고정

👉 보안 규칙이 코드 + 테스트로 이중 보호된다.


8️⃣ 최종 요약

  • 38강과 39강은 전부 권한 테스트 강화
  • 글과 댓글 모두 동일한 패턴으로 검증
  • 인증 실패(401)와 인가 실패(403)를 명확히 구분
  • 권한 로직은 반드시 테스트로 고정해야 한다
  • 테스트는 보안의 마지막 안전장치다

이번 강의들의 핵심은 이 문장으로 정리된다.

“권한 로직은 믿지 말고, 테스트로 증명하자.”

0개의 댓글