<웹 어플리케이션 인증의 특수성>
- Http 프로토콜을 이용하여 통신 -> 비연결성(Connectionless), 무상태(Stateless)의 특징을 지님
쿠기(Cookie)
- 서버에서 발급해줌
- 브라우저에 저장/존재함
- 브라우저에서 요청할 때마다 쿠키를 서버로 보냄
- 장점 : 인증을 위한 추가적인 데이터 저장이 필요없음
- 단점 : 보안상의 문제가있음. / 쿠키 사이즈가 커질수록 네트워크 부하가 심해짐.
<쿠기의 구성요소>
- Name(이름) : 쿠키를 구별하는 데 사용되는 키 (중복 불가)
- Value(값) : 쿠키의 값
- Domain(도메인) : 쿠기가 저장된 도메인
- Path(경로) : 쿠기가 사용되는 경로
- Expires(만료기한) : 쿠키의 만료기한
세션(Session)
- 서버에서 클라이언트별 세션ID를 부여하고, 세션 정보를 서버에 저장한다.
- 서버에서 생성한 세션ID는 클라리언트의 쿠키 값(세션 쿠키)으로 저장되고, 클라이언트에서
요청을 보낼 때 이 세션 쿠키를 함께 보낸다. 서버에서는 클라이언트별 세션 쿠키 값이 저장되어 있어,
요청으로 온 쿠키값을 보고 어떤 클라이언트인지 식별할 수 있음.
- 장점 : 상대적으로 보안에 안전함. / 사용자마다 고유한 세션 ID가 발급되어, 요청마다 회원DB를 찾지 않음.
- 단점 : 세션ID를 생성하고, 서버에 저장해야하는 작업이 생김.
서버 세션 저장소를 사용하므로 요청이 많아지면 서버 부하 심해짐
JWT(JSON Web Token)
- JWT : 인증에 필요한 정보들을 암호화 시킨 토큰
- JWT토큰(Access Token)을 HTTP 헤더에 담아 서버가 클라이언트를 식별한다.
- 장점
- 동시 접속자가 많을 때 서버 부하를 낮춤.
- 클라이언트, 서버가 다른 도메인을 사용할 때 사용 가능.
- 인증 정보를 서버에 별도로 저장할 필요가 없음.
- 단점 - 구현 복잡도가 증가.
- JWT에 담는 내용이 커질수록 네트워크 비용이 증가.
- 이미 생성된 JWT를 일부만 만료시킬 방법이 없음.(토큰의 유효기간을 너무 길게 잡으면 안된다는 말)
- Secret key 유출 시 JWT 조작이 가능하다.
- Payload 자체는 암호화되지 않기 때문에 사용자의 중요한 정보를 담을 수 없다.
<JWT 구조> - Header : 토큰 타입, 해쉬 알고리즘(HS256 or RSA 등)으로 구성되어 있다.
- Payload : claim이 포함되는 영역으로, 토큰에 담을 정보를 갖고 있다.(고유ID 값이나 유효기간등이 포함되는 영역)
- Signature
- 인코딩된 Header와 Payload를 더한 뒤, secret key로 해싱해서 생성한다.
이 때, 해싱 방법은 Header에서 지정한 해쉬 알고리즘 방법으로 한다.
- Header와 Payload는 단순히 인코딩된 값이어서 누구든 복호화가 가능하나,
Signature는 서버 측에서 관리하는 secret key가 있어야 복호화가 가능하다.
- Signature 부분으로 토큰의 위변조 여부를 확인할 수 있다.