inblog logo
|
sxias
    REST API

    [REST API] 6. URI 설계 원칙

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

    ✅ URI 네이밍 컨벤션 정리

    구분
    주소 예시
    설명
    인증이 필요한 요청
    /s/**
    s는 secure의 약자로 로그인 인증이 필요함
    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 ㆍ a32176740@gmail.com

    RSS·Powered by Inblog