인증과 인가
인증 (Authentication): 사용자의 신원을 확인하는 과정이다. 사용자가 주장하는 신원이 실제로 그 사용자인지를 확인하기 위해 사용자 이름과 비밀번호, 생체 인식, OTP(일회용 비밀번호) 등을 사용한다.
인가 (Authorization): 인증된 사용자가 특정 자원이나 시스템에 접근할 수 있는 권한을 부여하는 과정이다. 즉, 인증을 통해 사용자의 신원이 확인된 후, 해당 사용자가 어떤 작업을 수행할 수 있는지를 결정한다.
간단히 말해, 인증은 "당신은 누구인가?"에 대한 질문이고, 인가는 "당신이 무엇을 할 수 있는가?"에 대한 질문이다. 이 두 과정은 보안 시스템에서 함께 작동하여 데이터와 시스템을 보호한다.
비연결성
비연결성(Connectionless)은 네트워크 통신에서 데이터 전송 방식 중 하나로, 송신자와 수신자 간에 고정된 연결을 유지하지 않고 데이터를 전송하는 방식을 의미한다. 이 방식은 다음과 같은 특징이 있다.
연결 설정 없음: 데이터 전송 전에 송신자와 수신자 간의 연결을 설정할 필요가 없다. 각 데이터 패킷은 독립적으로 전송된다.
패킷 기반 전송: 데이터는 패킷 단위로 전송되며, 각 패킷은 독립적으로 처리된다. 따라서 패킷이 수신 순서와 관계없이 도착할 수 있다.
오버헤드 감소: 연결을 설정하고 유지하는 데 필요한 리소스가 없으므로, 오버헤드가 줄어들어 빠른 데이터 전송이 가능하다.
신뢰성 부족: 비연결성 방식은 패킷 손실이나 중복, 순서 변경 등의 문제가 발생할 수 있으며, 이를 처리하기 위한 추가적인 메커니즘이 필요하다.
대표적인 비연결성 프로토콜로는 UDP(User Datagram Protocol)가 있다. UDP는 빠른 전송 속도를 제공하지만, 신뢰성 있는 데이터 전송이 필요한 경우에는 TCP(Transmission Control Protocol)와 같은 연결 지향 프로토콜을 사용하는 것이 일반적이다.
무상태(Stateless)
무상태(Stateless)는 네트워크 통신 및 애플리케이션 설계에서 중요한 개념으로, 클라이언트와 서버 간의 상호작용에서 서버가 클라이언트의 상태 정보를 저장하지 않는 방식을 의미한다. 이 방식의 주요 특징은 다음과 같다.
상태 정보 저장 없음: 각 요청은 독립적이며, 서버는 이전 요청과의 관계 없이 각 요청을 처리한다. 클라이언트의 상태나 이전 상호작용에 대한 정보를 기억하지 않는다.
서버의 간결함: 서버가 클라이언트의 상태를 관리하지 않기 때문에, 서버의 구현이 간단해지고 확장성이 높아진다. 여러 서버에 부하를 분산시키기 용이하다.
신뢰성 및 복원력: 서버가 상태 정보를 저장하지 않기 때문에, 서버가 재시작되거나 장애가 발생해도 클라이언트의 요청에 영향을 주지 않는다. 클라이언트는 모든 요청에 필요한 정보를 포함하여 서버에 보내야 한다.
HTTP 프로토콜과의 관계: HTTP 프로토콜은 기본적으로 무상태 프로토콜이다. 즉, 각 HTTP 요청은 독립적으로 처리되며, 클라이언트의 이전 요청에 대한 정보가 서버에 저장되지 않는다.
무상태 설계는 RESTful API와 같은 현대 웹 서비스 아키텍처에서 널리 사용되며, 각 요청이 필요한 모든 정보를 포함하도록 설계되어 있다. 이로 인해 시스템의 확장성과 유지보수성이 향상된다.
쿠키-세션 방식의 인증
쿠키-세션 방식의 인증은 웹 애플리케이션에서 사용자 인증을 관리하는 일반적인 방법이다. 이 방식은 사용자의 로그인 정보를 안전하게 저장하고, 이후의 요청에서 사용자의 신원을 확인하는 데 사용된다. 아래에서 쿠키와 세션의 개념 및 작동 방식을 설명하겠다.
쿠키:
세션:
로그인:
세션 저장:
쿠키 설정:
인증 유지:
로그아웃:
장점:
단점:
쿠키-세션 방식의 인증은 간편하고 널리 사용되지만, 보안과 성능을 고려하여 적절한 관리와 설정이 필요하다.
JWT(JSON Web Token) 기반 인증
JWT(JSON Web Token) 기반 인증은 사용자 인증을 위한 현대적인 방법으로, 클라이언트와 서버 간의 정보 교환을 안전하게 수행할 수 있는 방식이다. JWT는 JSON 형식으로 데이터를 안전하게 전송할 수 있도록 설계된 개방형 표준이다.
JWT는 세 부분으로 구성된다:
헤더(Header):
{
"alg": "HS256",
"typ": "JWT"
}페이로드(Payload):
{
"sub": "user_id",
"name": "홍길동",
"iat": 1516239022
}서명(Signature):
JWT는 위 세 부분을 점(.)으로 구분하여 연결한 문자열로 표현된다. 예를 들어:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyX2lkIiwibmFtZSI6Iu2VhO2XkO2VhOumVhO2VhOumVhO2VhO2VhO2VhO2VhO2VhIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
로그인:
JWT 저장:
인증 요청:
Authorization: Bearer <token>
토큰 검증:
로그아웃:
장점:
단점:
JWT 기반 인증은 특히 RESTful API와 같은 분산 시스템에서 널리 사용되며, 사용자 인증과 권한 부여를 간편하게 처리할 수 있는 강력한 방법이다.