[데브코스] Spring Boot 인증·인가(Auth) (37강) - 인증 정보가 없는 글 쓰기 요청에 대한 401 테스트 추가

zuno·2026년 1월 13일

37강에서는 글 쓰기 요청에 인증 정보가 없을 때
서버가 올바르게 401 Unauthorized를 반환하는지 검증하는
테스트 케이스를 추가한다.

겉으로 보면 단순한 테스트 하나 추가처럼 보이지만,
이 강의의 핵심은 “무엇을 꼼꼼하게 테스트해야 하는가”에 있다.


1️⃣ 이번 강의에서 변경된 핵심 내용

이번 커밋에서 변경된 내용은 두 가지다.

✔ Rq 클래스의 에러 메시지 개선

if (headerAuthorization == null || headerAuthorization.isBlank())
    throw new ServiceException("401-1", "로그인 후 이용해주세요.");
  • 기존: “Authorization 헤더가 존재하지 않습니다.”
  • 변경: “로그인 후 이용해주세요.”

👉 사용자 관점에서 더 자연스러운 메시지로 개선


✔ 인증 정보가 없는 글 쓰기 요청 테스트 추가

@Test
@DisplayName("글 쓰기, without authorization header")
void t10() throws Exception {
    ResultActions resultActions = mvc
            .perform(
                    post("/api/v1/posts")
                            .contentType(MediaType.APPLICATION_JSON)
                            .content("""
                                    {
                                        "title": "제목",
                                        "content": "내용"
                                    }
                                    """)
            )
            .andDo(print());

    resultActions
            .andExpect(handler().handlerType(ApiV1PostController.class))
            .andExpect(handler().methodName("write"))
            .andExpect(status().isUnauthorized())
            .andExpect(jsonPath("$.resultCode").value("401-1"))
            .andExpect(jsonPath("$.msg").value("로그인 후 이용해주세요."));
}

2️⃣ 왜 이 테스트가 중요한가?

강의에서 강조한 포인트는 이거다.

“권한 체크는 반드시 꼼꼼하게 테스트해야 한다.”

이유는 명확하다.


3️⃣ 유효성 검증 vs 권한 검증의 차이

🔹 유효성 검증 (Validation)

@Valid
@NotBlank
@Size(min = 2, max = 100)
  • 스프링과 검증 라이브러리가 처리
  • 검증 로직이 표준화되어 있음
  • 프레임워크 자체에 버그가 있을 확률이 매우 낮음

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


🔹 권한 검증 (Authorization)

Member actor = rq.getActor();
post.checkActorCanDelete(actor);
  • 개발자가 직접 구현
  • 조건 하나만 잘못 써도 보안 사고로 이어질 수 있음
  • 실수할 확률이 높음

👉 테스트를 안 하면 위험하다


4️⃣ “인증이 없으면 막아야 한다”를 테스트로 보장하기

이 테스트는 단순히 응답을 확인하는 게 아니다.

이걸 보장한다 👇

  • Authorization 헤더가 없으면
  • 컨트롤러 로직이 실행되기 전에
  • 401 Unauthorized로 차단된다

즉,

“로그인하지 않은 사용자는 글을 쓸 수 없다”
라는 정책을 코드가 아니라 테스트로 고정한 것이다.


5️⃣ 실제 흐름 정리

요청 흐름

  1. 클라이언트가 /api/v1/posts POST 요청
  2. Authorization 헤더 없음
  3. rq.getActor() 호출
  4. 즉시 401-1 예외 발생
  5. 컨트롤러 비즈니스 로직 실행 ❌

👉 보안상 매우 바람직한 흐름


6️⃣ 왜 “글 쓰기”부터 테스트했을까?

글 쓰기는 대표적인 인증 필수 기능이다.

  • 로그인 안 한 사용자가
  • 가장 먼저 시도할 가능성이 높은 기능

👉 그래서 글 쓰기 요청을 기준으로 테스트를 추가한 것이다.

이 패턴은 이후에도 그대로 확장된다.

  • 글 수정 (인증 없음)
  • 글 삭제 (인증 없음)
  • 댓글 작성/수정/삭제 (인증 없음)

7️⃣ 이 강의의 진짜 메시지

37강의 핵심 메시지는 이 문장이다.

“권한 체크는 개발자가 직접 만드는 로직이기 때문에
반드시 테스트로 안전망을 만들어야 한다.”


8️⃣ 지금까지 흐름 한 번에 정리

  • 34강: Rq 도입 → 인증 중복 제거
  • 35강: Rq + Thread/Request 이해
  • 36강: 인가 로직을 엔티티로 이동
  • 37강: 인증/인가 실패 케이스를 테스트로 고정

👉 단순 기능 구현이 아니라
보안과 책임 분리를 단계적으로 강화하는 흐름이다.


9️⃣ 최종 요약

  • 인증 정보가 없으면 글 쓰기는 불가능해야 한다
  • 이 규칙을 테스트로 명확히 고정했다
  • 유효성 검증보다 권한 검증 테스트가 더 중요하다
  • 권한 로직은 사람이 짜기 때문에 실수 가능성이 크다
  • 테스트는 그 실수를 막는 마지막 안전장치다

이 강의는
“보안은 코드로만 만드는 게 아니라 테스트로 완성된다”는 걸 알려준다.

0개의 댓글