[TIL] 인증 / 인가란?

냠냠빈·2024년 12월 23일

🔐 인증(Authentication)과 인가(Authorization)

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


🔑 인증(Authentication)

인증은 사용자가 누구인지 확인하는 과정입니다. 쉽게 말해, 사용자가 자신이 주장하는 사람임을 증명하는 단계입니다.

🧐 인증의 특징

  1. 사용자의 신원을 확인합니다. (예: ID와 비밀번호 입력)

  2. 인증 실패 시 보통 401 상태 코드를 반환하며 요청을 종료합니다.

  3. 민감한 정보(username, password 등)는 절대 노출되면 안 됩니다.

📋 작성 요구사항

  • 민감한 정보를 DTO에 포함하지 않도록 설계합니다.
  • 인증 실패 시 적절한 에러 코드를 반환하도록 처리합니다.

기존 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"
}
  • username과 password 필드를 제외하여 민감 정보를 보호합니다.

인증 관련 코드 예시

@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");
    }
}

🔒 인가(Authorization)

인가란 인증된 사용자가 요청한 자원에 접근할 권한이 있는지 확인하는 과정입니다. 인증을 통과했다고 해서 모든 자원에 접근할 수 있는 것은 아닙니다. 예를 들어, 글을 삭제하려면 인증뿐만 아니라 삭제 권한이 있는지 체크해야 합니다.

🧐 인가의 특징

  1. 사용자의 권한(Role)을 기반으로 자원 접근 여부를 결정합니다.

  2. 인가 실패 시 보통 403 상태 코드를 반환하며 요청을 종료합니다.

  3. 보통 Authorization 헤더를 사용해 인증 정보를 전달합니다. (이때의 Authorization은 Credentials의 의미로 사용됩니다.)

📋 작성 요구사항

  • 역할(Role) 및 권한 기반의 접근 제어를 설계합니다.
  • 인가 실패 시 적절한 에러 메시지를 반환합니다.

인가 관련 코드 예시

@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 Unauthorized403 Forbidden
사용 사례로그인, 회원가입리소스 접근 제어 (예: 글 삭제, 파일 다운로드)

✨ 개발 포인트

  1. DTO 설계 시 민감 정보 제거
  • 인증 정보를 불필요하게 노출하지 않도록 주의합니다.
  1. 권한(Role) 기반의 접근 제어
  • 인가를 통해 권한 체크를 명확히 설계합니다.
  1. 에러 메시지 처리
  • 인증 실패(401)와 인가 실패(403)를 명확히 구분하여 사용자에게 알립니다.

참고문헌

인증(Authentication)/인가(Authorization)란 무엇인가
인증(Authentication)과 인가(Authorization)

profile
다 먹어버릴거야!

0개의 댓글