인증과 인가
인증(Authentication)
인증은 사용자를 식별하는 행위를 말한다.
쇼핑몰 사이트에서 마이페이지에 들어가려고 해보자. 마이페이지에 들어가려면 내가 이 사이트에 가입되어 있다는 증명이 필요하고, 그 증명 방법이 로그인이다.
웹 개발에서의 인증은 보통 사용자의 신원을 증명하는, 즉 로그인이라고 생각하면 된다.
인가(Authorization)
인가는 접근 권한을 확인하는 프로세스를 말한다.
같은 쇼핑몰 사이트에서 관리자인지 고객인지에 따라 접근할 수 있는 페이지가 다르다고 가정해보자. 관리자든 고객이든 일단 이 사이트에 가입된 사용자라는 것을 증명(인증)해야 하고, 그 후에 이 사용자가 이 페이지에 접근할 수 있는 권한이 있는가(인가)에 대해 판단한다.
결론적으로 인가는 인증 이후에 발생하는 프로세스라고 할 수 있다.
쿠키와 세션
쿠키
웹 서버가 생성하여 웹 브라우저에게 전송하는 작은 정보 파일이다.
- 사용자가 로그인을 한다.
- 서버가 로그인에 필요한 정보를 쿠키에 적어서 사용자에게 준다.
- 사용자는 쿠키를 웹 브라우저에 저장해놓고 로그인이 필요할 때 서버에게 이 쿠키를 준다.
- 자동 로그인 성공
장점
로그인에 필요한 정보가 서버에 저장되는게 아니기 때문에 서버 저장 공간을 절약할 수 있다. 또한, HTTP는 서버가 상태를 저장하지 않는 stateless를 지향한다. 로그인에 필요한 정보를 서버에 저장해 놓은 게 아니기 때문에 stateless 하다고 할 수 있고, 서버가 stateless이므로 RESTful 하다고 할 수 있다.
단점
로그인이 필요할 일이 생기면 쿠키가 서버로 전송된다. 이때 쿠키가 인터넷 공간을 통해 날아가기 때문에 보안이 취약하다는 단점이 있다.
세션
사용자와 서버 사이의 연결을 확인하기 위한 정보를 말한다.
- 사용자가 로그인을 한다.
- 서버가 데이터를 저장한 후 쿠키에 세션 아이디를 적어서 사용자에게 준다.
- 사용자는 쿠키를 웹 브라우저에 저장해놓고, 로그인이 필요할 때 서버에게 쿠키를 준다.
- 서버는 쿠키에 적힌 세션 아이디로 사용자 데이터를 찾아서 자동 로그인 시켜준다.
장점
쿠키에 주요 정보는 없고, 세션 아이디만 적혀있으므로 비교적 보안이 좋다.
단점
서버가 정보를 저장하고있기 때문에 stateless가 아니다.
JWT
JSON Web Token의 약자로, JSON 형태의 데이터를 안전하게 전송하기 위한 웹에서 사용하는 토큰이다. 토큰은 토큰을 가진 사용자가 증명을 하기 위해 사용된다.
장점
서버가 상태를 저장하지 않기 때문에 두 번째와 세 번째의 장점을 가진다.
또한, 토큰을 발행하는 서버를 따로 만들 수도 있다.
- 보안에 강하며, 암호화가 되어있다.
- stateless
- 서버 부담을 줄여줄 수 있다.
구조
Decoded에 적혀있는 내용들을 암호화해서 Encoded 내용을 만든다.
구조 | 내용 |
Header | 토큰을 암호화할 때 사용한 알고리즘, 토큰 타입(jwt) |
Payload | 사용자의 정보(이름, 주소 등, 비밀번호는 담지 않음)가 JSON 형태로 적힌다. iat는 issued at으로, 토큰이 발행된 시간을 초 단위로 나타낸다. |
Verify Signature | Header, Payload가 이 데이터 값으로 적혀있다는 것을 보증하는 서명이다. Payload 값이 바뀌면 서명 값도 바뀌기 때문에 서명이 달라졌다면 서버에서 받아주지 않는다. |
인증 - 인가 절차
- 사용자가 로그인을 시도한다.
- 서버는 내부 로직을 확인하고 토큰(jwt)을 발행한다. 토큰 발행 시점은 언제 로그인했는가와 일치하며, 이 정보는 토큰의 payload에 적혀있다.
- 서버는 당분간 사용자의 로그인을 유지시켜주며, 쿠키에 토큰(jwt)을 담아 함께 보내준다. 사용자는 다음 요청부터 이 토큰을 서버에게 전달하면 서버가 서명을 확인하고 자동으로 로그인시켜준다.
- 사용자가 서버에게 다른 요청을 보내면서 Header에 토큰을 넣어 보낸다.
- 서버가 서명을 확인한다.
- 서명이 맞으면 사용자를 로그인시켜준다.
'데브코스' 카테고리의 다른 글
[7주차 - DAY1] 도서 정보 API 설계 및 ERD 설계 (0) | 2024.04.08 |
---|---|
[6주차 - DAY5] 도서 정보 API 설계 (0) | 2024.04.05 |
[6주차 - DAY4] cookie, jwt 설정 (0) | 2024.04.04 |
[6주차 - DAY3] JWT를 이용한 인증 및 인가 (0) | 2024.04.03 |
[6주차 - DAY2] 유효성 검사 (1) | 2024.04.02 |