[REST API] 6. URI 설계 원칙

문정준's avatar
May 09, 2025
[REST API] 6. URI 설계 원칙

✅ URI 네이밍 컨벤션 정리

구분
주소 예시
설명
인증이 필요한 요청
/s/**
ssecure의 약자로 로그인 인증이 필요함
JSON 응답 요청
/api/**
api는 JSON을 응답하는 REST 요청
인증 + JSON 응답
/s/api/**
인증이 필요한 JSON 요청
인증 없이 JSON 요청
/api/**
글목록, 디테일 등 누구나 접근 가능한 API
메인 페이지, 로그인, 회원가입
/, /login, /join
일반 HTML 뷰 응답, 인증 필요 없음
❗ 회원가입, 로그인, 로그아웃은 API 접두어를 붙이지 않고 처리

🔐 인증 처리: LoginInterceptor

❗ 기존 잘못된 방식

if (uri.contains("s")) { // "/api/boards"처럼 s가 포함된 모든 경로가 걸림 }

✅ 개선된 방식 (정확하게 /s로 시작하는 URI만 필터링)

public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri = request.getRequestURI(); // ex: /s/api/board System.out.println("uri: " + uri); HttpSession session = request.getSession(); User sessionUser = (User) session.getAttribute("sessionUser"); if (uri.startsWith("/s")) { if (sessionUser == null) { throw new Exception401("인증이 필요합니다"); } } return true; } }

3) 실제 컨트롤러 URI 설계 적용 예

🟡 인증 필요 + JSON 응답 (/s/api)

  • 글쓰기
    • @PostMapping("/s/api/board")
  • 글 수정
    • @PutMapping("/s/api/board/{id}")
  • 댓글 작성 및 삭제
    • @PostMapping("/s/api/reply") @DeleteMapping("/s/api/reply/{id}")

🟢 인증 불필요 + JSON 응답 (/api)

  • 글목록, 글보기, 글상세
    • @GetMapping({"/", "/api/board"}) @GetMapping("/api/board/{id}") @GetMapping("/api/board/{id}/detail")
  • 유저네임 중복 체크
    • @GetMapping("/api/check-username-available/{username}")

🔵 인증 불필요 + 뷰 리턴

  • 회원가입, 로그인, 로그아웃 등
    • @PostMapping("/join") @PostMapping("/login") @GetMapping("/logout")

4) REST API 분리 목적

  • 프론트엔드 분리 대응 (SPA, 모바일 앱 등): JSON API 구조가 필수
  • 시큐리티 인터셉터 유연화: 인증 구분이 명확해짐
  • 추후 JWT 기반 인증 적용 용이: /s/api는 추후 JWT 토큰 검사로 대체 가능
Share article

sxias