들어가며
웹 사이트를 이용하며 로그인을 하고나면 로그아웃하거나 브라우저를 종료하기 전까지 내가 로그인 한 상태라는 걸 지속적으로 확인 할 수 있다. 웹 사이트는 어떻게 내가 로그인 상태인 것을 확인하는지 이때 사용하는 웹 인증 방식들에 대해서 정리하려고 한다.
본론
Web 인증
: 사용자가 누구인지 확인하고, 각 서비스에 대한 사용자의 권한을 확인하는 것
1. 사용자 인증
: 사용자의 인증 정보를 확인하여 올바른 사용자인지 인증하는 것
-
ID/PW 기반 로그인
: 서버에 저장된 ID와 PW를 기반으로 사용자 인증
-
소셜로그인 (Oauth2)
: Google, Naver, Kakao 등 타 사이트를 통한 소셜 기반 사용자 인증
-
이메일 인증
: 사용자가 이용중인 이메일을 통해 사용자 인증
-
휴대폰 인증
: 사용자가 이용중인 휴대폰을 통해 사용자 인증
-
다중 인증요소(MFA)
: ID/PW에 추가로 OTP등 여러 요소를 요청하여 인증
2. 세션 관리
: 로그인 한 사용자의 정보를 일정 시간 유지시켜 권한을 확인하는 것
-
HTTP Session
- 사용자의 인증 정보를 검증하여 Session ID를 생성하여 쿠키에 담아 사용자에게 전달
- 사용자에 쿠키에는 세션 ID만 존재하고 세션에 담긴 정보는 서버측에서 관리되며 갱신 및 정보 변경을 서버에서 담당한다.
-
HTTP Cookie
- 사용자의 인증 정보를 검증하여 쿠키에 인증 정보를 담아 사용자에게 전달
- 쿠키에 있는 인증 정보를 서버에서 읽어 사용하는 방식으로 보안 문제에 취약 할 수도 있어
민감한 정보를 다루는 경우 HTTPS와 같은 보안 프로토콜을 사용해야 한다.
-
HTTP Header
- 사용자의 인증 정보를 암호화된 방식으로 사용자에게 전달
- HTTP 요청시 Request Header에 인증 값을 포함하여 요청하는 방식
JWT(Json Web Token)
: JWT는 웹 표준으로 데이터를 JSON 객체로 사용해 편리하게 사용자 인증을 확인하는 토큰 기반의 인증 방식이다. 일반적으로 HTTP Header에 담아 사용자 인증에 사용한다.
- JWT의 구성
- Header: JWT의 타입과 암호화 알고리즘
- Payload: 실제 사용하고자 하는 데이터(사용자 인증정보, 권한)
- Signature: Header와 Payload를 조합해 비밀키로 서명된 특수한 값. 해당 값으로 데이터의 무결성을 보장
- JWT의 장점
- 토큰 기반의 인증 방식으로, 서버 측에 별도의 세션 저장소가 필요없음
- JSON 형식으로 인코딩되어, 다양한 플랫폼 간에 전송이 쉬움
- Signature를 통해 무결성을 검증하여 변조 여부를 쉽게 파악할 수 있음
- JWT의 단점
- JWT의 크기가 커질 경우, 네트워크 대역폭이 증가
- JWT는 한 번 발급된 후에 내부 정보를 수정할 수 없으므로, 만료 시간을 짧게 설정해야 함
- JWT를 탈취당하면, 해당 토큰을 이용한 모든 요청이 인증되므로, HTTPS와 같은 보안 프로토콜을 사용해야 한다.
결론
- 로그인 시 검증하는 방식과 로그인 이후 로그인 상태를 확인하는 것을 구분하자
- 세션을 관리하는 데에는 여러 가지 방식이 있고 각 방식에 대한 차이점이 존재한다.