학습 목표
- 안전한 게시판 의 핵심 개념을 안다
- ALTER ADD COLUMN created_at 의 동작을 안다
- 본인 글만 수정·삭제 가능. v6 — 실용 가능한 게시판.
1. 문제
v5 의 두 가지 답답함 — ① 누구나 남의 글을 수정·삭제 가능. ② myboard 에 작성일 컬럼이 없어 「언제 쓴 글인지」 표시할 수 없음.
2. 새 도구
ALTER ADD created_at + 인가: 운영 중인 myboard 에 created_at 컬럼을 ADD. DEFAULT CURRENT_TIMESTAMP 로 기존 row 도 채움. 이어서 작성자 문자열과 세션 ID 비교로 본인 확인.
3. 코드
-- 스키마 진화
ALTER TABLE myboard
ADD COLUMN created_at DATETIME DEFAULT CURRENT_TIMESTAMP;
// com.smhrd.domain.Board — createdAt 합류
@Data @AllArgsConstructor @NoArgsConstructor
public class Board {
private int num;
private String title;
private String writer;
private String content;
private LocalDateTime createdAt; // ← v6 추가
}
@PostMapping("/board/update")
public String update(Board b, HttpSession session) {
Member u = (Member) session.getAttribute("loginUser");
Board original = service.selectOne(b.getNum());
// 본인 확인 (인가) — 문자열 비교
if (!original.getWriter().equals(u.getId())) {
return "redirect:/board/view?num=" + b.getNum() + "&err=forbidden";
}
service.update(b, u.getId());
return "redirect:/board/view?num=" + b.getNum();
}
@PostMapping("/board/delete")
public String delete(@RequestParam int num, HttpSession session) {
Member u = (Member) session.getAttribute("loginUser");
Board original = service.selectOne(num);
if (!original.getWriter().equals(u.getId())) {
return "redirect:/board/view?num=" + num + "&err=forbidden";
}
service.delete(num, u.getId());
return "redirect:/board/list";
}
<!-- view.jsp 에서 -->
<p>작성자: ${board.writer} | 작성일: ${board.createdAt}</p>
<c:if test="${board.writer == sessionScope.loginUser.id}">
<a href="/board/edit?num=${board.num}">수정</a>
<form action="/board/delete" method="post" style="display:inline;">
<input type="hidden" name="num" value="${board.num}">
<button>삭제</button>
</form>
</c:if>
4. 정리
- ALTER ADD COLUMN created_at DATETIME DEFAULT CURRENT_TIMESTAMP
- writer.equals(userId) 문자열 비교가 본인 확인
- JSP c:if 는 UI 편의 / 진짜 보안은 서버
- v6 마일스톤
5. Before / After
전 차시
v5 의 위험 — 누구나 남의 글을 수정·삭제 가능. 본인 확인이 필요.
이번 차시
본인 글만 수정·삭제 가능. v6 — 실용 가능한 게시판.
학습 확인 체크리스트
- ALTER ADD COLUMN created_at + 기존 row 자동 채움
- Board 에 createdAt 필드 합류
- writer.equals(userId) 본인 확인
- Service / Controller 이중 체크