✅ 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