개발을 하면서 "인증"과 "인가"는 꼭 알아야 하는 중요한 개념입니다. 이 두 가지는 보안과 관련된 핵심 요소로, 서로 다른 목적과 역할을 가지고 있습니다.

인증은 사용자가 누구인지 확인하는 과정입니다. 쉽게 말해, 사용자가 자신이 주장하는 사람임을 증명하는 단계입니다.
사용자의 신원을 확인합니다. (예: ID와 비밀번호 입력)
인증 실패 시 보통 401 상태 코드를 반환하며 요청을 종료합니다.
민감한 정보(username, password 등)는 절대 노출되면 안 됩니다.
기존 DTO 구조
{
"id": 3,
"author": {
"id": 4,
"username": "user2",
"password": "1234",
"nickname": "유저2",
"createdDatetime": "2024-12-20T15:19:36.325656",
"modifiedDatetime": "2024-12-20T15:19:36.325656"
},
"title": "농구 하실 분?",
"content": "16시 까지 10명을 모아야 합니다.",
"createdDatetime": "2024-12-20T15:19:36.355738",
"modifiedDatetime": "2024-12-20T15:19:36.355738"
}
수정된 DTO 구조
{
"id": 3,
"author": {
"id": 4,
"nickname": "유저2",
"createdDatetime": "2024-12-20T15:19:36.325656",
"modifiedDatetime": "2024-12-20T15:19:36.325656"
},
"title": "농구 하실 분?",
"content": "16시 까지 10명을 모아야 합니다.",
"createdDatetime": "2024-12-20T15:19:36.355738",
"modifiedDatetime": "2024-12-20T15:19:36.355738"
}
@PostMapping("/login")
public ResponseEntity<?> authenticate(@RequestBody LoginRequest request) {
try {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
);
SecurityContextHolder.getContext().setAuthentication(authentication);
String token = jwtTokenProvider.createToken(authentication);
return ResponseEntity.ok(new AuthResponse(token));
} catch (AuthenticationException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
}
}
인가란 인증된 사용자가 요청한 자원에 접근할 권한이 있는지 확인하는 과정입니다. 인증을 통과했다고 해서 모든 자원에 접근할 수 있는 것은 아닙니다. 예를 들어, 글을 삭제하려면 인증뿐만 아니라 삭제 권한이 있는지 체크해야 합니다.
사용자의 권한(Role)을 기반으로 자원 접근 여부를 결정합니다.
인가 실패 시 보통 403 상태 코드를 반환하며 요청을 종료합니다.
보통 Authorization 헤더를 사용해 인증 정보를 전달합니다. (이때의 Authorization은 Credentials의 의미로 사용됩니다.)
@PreAuthorize("hasRole('ADMIN') or #authorId == authentication.principal.id")
@DeleteMapping("/posts/{id}")
public ResponseEntity<?> deletePost(@PathVariable Long id, @RequestParam Long authorId) {
postService.deletePost(id);
return ResponseEntity.ok("Post deleted successfully");
}
| 구분 | 인증(Authentication) | 인가(Authorization) |
|---|---|---|
| 목적 | 사용자의 신원 확인 | 사용자의 권한 확인 |
| 실패 시 응답 | 401 Unauthorized | 403 Forbidden |
| 사용 사례 | 로그인, 회원가입 | 리소스 접근 제어 (예: 글 삭제, 파일 다운로드) |
인증(Authentication)/인가(Authorization)란 무엇인가
인증(Authentication)과 인가(Authorization)