인증 & 인가
인증(Authentication) 이란?
사용자가 누구인지 확인하는 과정
인가(Authorization) 란?
인증된 사용자가 특정 리소스에 접근할 수 있는 권한을 결정하는 과정
쉽게 예시를 들어보면
공항에서 보안 검사대를 통과할 때 여권과 티켓을 제시해야 하는데 이것이 바로 인증 과정이다.
여권과 티켓(웹에선 아이디, 비밀번호)을 통해 비행기를 탈 수 있는 승객임을 증명하는 것이다.
즉, 인증은 누구인지 확인하는 과정이다.
인증 과정을 통과한 후에도 이코노미석 티켓을 구매한 승객은 이코노미석 영역에만 앉을 수 있다.
비즈니스 또는 퍼스트 클래스 영역에는 들어갈 수 없다. 이것이 인가 과정이다.
인증된 사용자(승객)가 어떤 리소스(좌석 클래스 영역)에 접근할 수 있는 권한이 있는지 결정하는 것이다.
쿠키

사용자가 어떤 웹 사이트를 방문했을 때 웹사이트가 사용하는 서버에서
사용자의 로컬 환경에 저장하는 작은 데이터를 말한다.
쿠키는 키와 값으로 이루어져 있고 만료기간, 도메인 등의 정보를 가진다.

클라이언트가 정보를 요청하면 서버에서 정보를 값으로 넣은 쿠키를 생성해서 요청한 정보, 즉 HTTP 헤더와 함께 돌려보낸다. 클라이언트는 로컬, 즉 브라우저에 쿠키를 저장하며 이후 사이트에 재방문할 때는 로컬 환경에 있는 쿠키와 함께 서버에 요청한다.
세션 기반 인증
사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증하는 방식이다.
스프링 시큐리티에서는 기본적으로 세션 기반 인증을 제공한다.
- 사용자가 로그인을 하면 서버 측에서 해당 사용자의 세션을 생성하고, 세션 ID를 클라이언트에게 전송한다.
- 클라이언트는 이후의 모든 요청에 세션 ID를 포함시켜 서버에 보내고, 서버는 세션 ID를 통해 사용자를 식별하고 인증한다.
장점 : 서버 측에서 사용자의 세션 정보를 관리하기 때문에, 인증 상태를 쉽게 제어하고 관리할 수 있으며 세션 ID는 예측하기 어렵기 때문에 보안에서도 안정적이다.
단점 : 세션을 관리해야한다는 문제가 있어 리소스 사용 및 서버 확장에서의 어려움이 발생한다.
토큰 기반 인증 JWT(JSON Web Token)
사용자가 서버에 접근할 때 이 사용자가 인증된 사용자인지 확인하는 방법 중 하나이다.
토큰 이란?
서버에서 클라이언트를 구분하기 위한 유일한 값
서버가 토큰을 생성해서 클라이언트에게 제공하고, 클라이언트는 여러 요청을 이 토큰과 함께 신청한다.
서버는 토큰만 보고 유효한 사용자인지 검증한다.

1. 클라이언트가 아이디와 비밀번호를 서버에게 전달하면서 인증을 요청하면
2. 서버는 아이디와 비밀번호를 확인해 유효한 사용자인지 검증한다.
3. 클라이언트는 서버에서 준 토큰을 저장한다.
4. 이후 인증이 필요한 API를 사용할 때 토큰을 함께 보낸다.
5. 서버는 토큰이 유효한지 검증한다.
6. 토큰이 유효하다면 클라이언트가 요청한 내용을 처리한다.
토큰 기반 인증의 특징
- 무상태성 (stateless)
- 확장성
- 무결성
JWT
- 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의 하는 개방형 표준이다.
발급받은 JWT를 이용해 인증을 하려면 HTTP 요청 헤더 중에 Authorization 키 값에
Bearer + JWT 토큰값을 넣어보내야 한다.

JWT의 구조
aaaaa . bbbbb . ccccc
헤더 . 내용 . 서명 으로 이루어지며 . 을 기준으로 구분된다.
헤더 -> 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담는다.
{
"typ": "JWT"
"alg": "HS256"
}
내용 -> 토큰과 관련된 정보를 담는다.
내용의 한 덩어리를 클레임(claim) 이라고 한다. ( 등록된 클레임, 공개 클레임, 비공개 클레임으로 나뉨)
서명 -> 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도
헤더의 인코딩 값과 내용의 인코딩 값을 합친 후에 주어진 비밀키를 사용해 해시값을 생성
리프레시 토큰
토큰이 노출되어 악의적인 용도로 쓰일 것을 해결하기위해 등장
엑세스 토큰과는 별개의 토큰으로 사용자를 인증하기 위한 용도가 아닌 엑세스 토큰이 만료되었을 때 새로운 엑세스 토큰을 발급하기 위해 사용된다.
엑세스 토큰의 유효기간은 짧게 설정하고, 리프레시 토큰의 유효 기간은 길게 설정하면 공격자가 엑세스토큰을 탈취하더라도 잠시 뒤에는 사용할 수 없는 토큰이 되므로 안정성이 높아짐.

6. 시간이 지나고 액세스 토큰이 만료된 뒤에 클라이언트에서 원하는 정보를 얻기 위해 서버에게 API 요청을 보낸다.
7. 서버에서 엑세스 토큰이 유효한지 검사하고, 만료된 토큰이면 유효하지 않기에 토큰이 만료되었다는 오류를 전달
8. 클라이언트에서는 이 응답을 받고 저장해둔 리프레시 토큰과 함께 새로운 액세스 토큰을 발급하는 요청을 전송
9. 서버에서는 전달받은 리프레시 토큰이 유효한지, DB에서 리프레시 토큰을 조회한 후 저장해둔 리프레시 토큰과 같은지 확인 한다
10. 만약 유효한 리프레시 토큰이라면 새로운 액세스 토큰을 생성한뒤 응답
'🚣활동 > 멋쟁이사자처럼' 카테고리의 다른 글
[멋사 12기 중앙해커톤 참여] (0) | 2024.08.09 |
---|---|
[멋쟁이사자처럼] 4주차 정기세션 (0) | 2024.03.31 |
[멋쟁이사자처럼] 3주차 정기세션 (0) | 2024.03.24 |
[멋쟁이사자처럼] 1주차 정기세션 - 2 (0) | 2024.03.13 |
[멋쟁이사자처럼] 1주차 정기세션 - 1 (0) | 2024.03.13 |
인증 & 인가
인증(Authentication) 이란?
사용자가 누구인지 확인하는 과정
인가(Authorization) 란?
인증된 사용자가 특정 리소스에 접근할 수 있는 권한을 결정하는 과정
쉽게 예시를 들어보면
공항에서 보안 검사대를 통과할 때 여권과 티켓을 제시해야 하는데 이것이 바로 인증 과정이다.
여권과 티켓(웹에선 아이디, 비밀번호)을 통해 비행기를 탈 수 있는 승객임을 증명하는 것이다.
즉, 인증은 누구인지 확인하는 과정이다.
인증 과정을 통과한 후에도 이코노미석 티켓을 구매한 승객은 이코노미석 영역에만 앉을 수 있다.
비즈니스 또는 퍼스트 클래스 영역에는 들어갈 수 없다. 이것이 인가 과정이다.
인증된 사용자(승객)가 어떤 리소스(좌석 클래스 영역)에 접근할 수 있는 권한이 있는지 결정하는 것이다.
쿠키

사용자가 어떤 웹 사이트를 방문했을 때 웹사이트가 사용하는 서버에서
사용자의 로컬 환경에 저장하는 작은 데이터를 말한다.
쿠키는 키와 값으로 이루어져 있고 만료기간, 도메인 등의 정보를 가진다.

클라이언트가 정보를 요청하면 서버에서 정보를 값으로 넣은 쿠키를 생성해서 요청한 정보, 즉 HTTP 헤더와 함께 돌려보낸다. 클라이언트는 로컬, 즉 브라우저에 쿠키를 저장하며 이후 사이트에 재방문할 때는 로컬 환경에 있는 쿠키와 함께 서버에 요청한다.
세션 기반 인증
사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증하는 방식이다.
스프링 시큐리티에서는 기본적으로 세션 기반 인증을 제공한다.
- 사용자가 로그인을 하면 서버 측에서 해당 사용자의 세션을 생성하고, 세션 ID를 클라이언트에게 전송한다.
- 클라이언트는 이후의 모든 요청에 세션 ID를 포함시켜 서버에 보내고, 서버는 세션 ID를 통해 사용자를 식별하고 인증한다.
장점 : 서버 측에서 사용자의 세션 정보를 관리하기 때문에, 인증 상태를 쉽게 제어하고 관리할 수 있으며 세션 ID는 예측하기 어렵기 때문에 보안에서도 안정적이다.
단점 : 세션을 관리해야한다는 문제가 있어 리소스 사용 및 서버 확장에서의 어려움이 발생한다.
토큰 기반 인증 JWT(JSON Web Token)
사용자가 서버에 접근할 때 이 사용자가 인증된 사용자인지 확인하는 방법 중 하나이다.
토큰 이란?
서버에서 클라이언트를 구분하기 위한 유일한 값
서버가 토큰을 생성해서 클라이언트에게 제공하고, 클라이언트는 여러 요청을 이 토큰과 함께 신청한다.
서버는 토큰만 보고 유효한 사용자인지 검증한다.

1. 클라이언트가 아이디와 비밀번호를 서버에게 전달하면서 인증을 요청하면
2. 서버는 아이디와 비밀번호를 확인해 유효한 사용자인지 검증한다.
3. 클라이언트는 서버에서 준 토큰을 저장한다.
4. 이후 인증이 필요한 API를 사용할 때 토큰을 함께 보낸다.
5. 서버는 토큰이 유효한지 검증한다.
6. 토큰이 유효하다면 클라이언트가 요청한 내용을 처리한다.
토큰 기반 인증의 특징
- 무상태성 (stateless)
- 확장성
- 무결성
JWT
- 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의 하는 개방형 표준이다.
발급받은 JWT를 이용해 인증을 하려면 HTTP 요청 헤더 중에 Authorization 키 값에
Bearer + JWT 토큰값을 넣어보내야 한다.

JWT의 구조
aaaaa . bbbbb . ccccc
헤더 . 내용 . 서명 으로 이루어지며 . 을 기준으로 구분된다.
헤더 -> 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담는다.
{
"typ": "JWT"
"alg": "HS256"
}
내용 -> 토큰과 관련된 정보를 담는다.
내용의 한 덩어리를 클레임(claim) 이라고 한다. ( 등록된 클레임, 공개 클레임, 비공개 클레임으로 나뉨)
서명 -> 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도
헤더의 인코딩 값과 내용의 인코딩 값을 합친 후에 주어진 비밀키를 사용해 해시값을 생성
리프레시 토큰
토큰이 노출되어 악의적인 용도로 쓰일 것을 해결하기위해 등장
엑세스 토큰과는 별개의 토큰으로 사용자를 인증하기 위한 용도가 아닌 엑세스 토큰이 만료되었을 때 새로운 엑세스 토큰을 발급하기 위해 사용된다.
엑세스 토큰의 유효기간은 짧게 설정하고, 리프레시 토큰의 유효 기간은 길게 설정하면 공격자가 엑세스토큰을 탈취하더라도 잠시 뒤에는 사용할 수 없는 토큰이 되므로 안정성이 높아짐.

6. 시간이 지나고 액세스 토큰이 만료된 뒤에 클라이언트에서 원하는 정보를 얻기 위해 서버에게 API 요청을 보낸다.
7. 서버에서 엑세스 토큰이 유효한지 검사하고, 만료된 토큰이면 유효하지 않기에 토큰이 만료되었다는 오류를 전달
8. 클라이언트에서는 이 응답을 받고 저장해둔 리프레시 토큰과 함께 새로운 액세스 토큰을 발급하는 요청을 전송
9. 서버에서는 전달받은 리프레시 토큰이 유효한지, DB에서 리프레시 토큰을 조회한 후 저장해둔 리프레시 토큰과 같은지 확인 한다
10. 만약 유효한 리프레시 토큰이라면 새로운 액세스 토큰을 생성한뒤 응답
'🚣활동 > 멋쟁이사자처럼' 카테고리의 다른 글
[멋사 12기 중앙해커톤 참여] (0) | 2024.08.09 |
---|---|
[멋쟁이사자처럼] 4주차 정기세션 (0) | 2024.03.31 |
[멋쟁이사자처럼] 3주차 정기세션 (0) | 2024.03.24 |
[멋쟁이사자처럼] 1주차 정기세션 - 2 (0) | 2024.03.13 |
[멋쟁이사자처럼] 1주차 정기세션 - 1 (0) | 2024.03.13 |