인증과 인가
API Authentication(인증)이란
- API 리소스 접근을 허용하기 전에 사용자의 신원을 확인하는 것
Authentication(인증) : 신원을 확인 (신분증!)
Authorization (인가) : 특정 리소스에 접근을 허가 또는 거절 (등급별 게시판 조회!)
대표적인 인증 방법 네가지
- Basic Authentication
- 이름에서 알 수 있듯이 가장 간단한 형태
- HTTP 인증은 헤더에 저장된다. 이 때 Base64로 인코딩 된다.
- 인증 정보가 평문으로 전달되어 보안이 좋지 않다.
- 매 HTTP 요청에서 인증을 진행한다. (서버로 ID/PWD를 전송)
- Token Authentication
- 사용자 별 고유한 토큰을 이용한다.
- 매 HTTP 요청의 헤더에 토큰을 저장한다.
- 토큰에 지정된 세션 동안 인증과 인가가 진행된다.
- OAuth Authentication
- 인증을 위한 표준 프로토콜.
- Twitter, Facebook, Google과 같이 외부 소셜 서비스 기반으로 Thrid-Party 프로그램(우리가 개발하는 웹)에 간편하게 인증을 한다.
- Third-Party 프로그램이 (클라이언트 대신) 직접 서버에 접근 권한을 위임 받는 방식을 말한다.
- 외부 서비스의 OAuth 인증을 이용해 사용자의 ID/PWD 공유 없이도 데이터에 대한 액세스 권한을 부여할 수 있다.
- API Key Authentication
- 서버에서 키를 생성하여 사용자에게 제공한다.
JWT (Json Web Token)
인가를 위해 사용되는 토큰
DB에 조회할 필요가 없다.
Access Token
- 헤더에 추가하고 API에 통신한다. API가 vali check를 진행한다.
- 만료기간이 짧다. (몇분~ 몇시간)
- 클라이언트는 해석할 수 없다.
- JWT 형식, UUID 등 원하는 형태로 발급할 수 있다.
Refresh Token
JWT를 사용하면 클라이언트가 리소스에 엑세스 할때마다 일반적으로 Bearer라는 스키마를 사용해야하며 Authorization 헤더에 다음과 같이 정해진 규칙에의해 전송되어야합니다.
Authorization: Bearer <token>
JWT ↔ Session
유저는 인가가 필요할 때마다 HTTP Cookie 헤더에 세션 ID를 같이 전송합니다. 전송받은 세션 ID 자체로는 아무런 정보가 없기 때문에 세션 ID를 통해 유저를 특정하고 권한을 가지고 있는지 확인을 한 후, 서비스 또는 리소스에 대한 액세스를 허용합니다.
중복 로그인이 불가능해야 하거나 단일 디바이스에서 로그인을 해야 되는 경우, 세션을 사용하기도 합니다.
유저는 인가가 필요할 때마다 HTTP Authorizetion 헤더에 Bearer 형태로 토큰을 같이 전송합니다.
서버는 토큰의 서명을 검증하여 유효성을 확인한다.
https://nomal-dev.tistory.com/14
OAuth 시퀀스 다이어그램
* Resource Owner : 유저
* Client : 우리가 개발하는 웹 서비스
* Authorization Server :
* Resource Server : 실제 ID/PWD 정보를 가진 서버
* Redirect URI : 인증을 마친 뒤 리다이렉션 될 위치
1. 로그인 요청 : 유저가 '카카오로 로그인하기' 버튼을 클릭한다.
2.
3. 로그인 페이지 제공 : 카카오 로그인 창이 뜸
4. ID/PW 제공 : 유저가 그 창에 ID/PWD를 입력함
5. Authorization Code 발급 : 로그인이 성공했을 경우 Auth server는 redirect url에 authorization code*를 포함하여 6. 유저를 리다이렉션 시킴. (* Access Token을 획득하기 위해 사용하는 코드, 수명이 매우 짧다)
7~8. 우리 서버가 AccessToken을 요청하고, 받아온 뒤, 저장함.
9. 로그인이 성공함.
10~13. 필요한 정보(성별, 이름, 나이 ...)를 요청함
'┝ framework > ┎ Spring' 카테고리의 다른 글
Map<Key, Interface>를 이용한 스프링 빈 활용 (0) | 2025.04.09 |
---|---|
[SpringBoot] profile과 bean (0) | 2025.04.04 |
spring webflux란? (0) | 2025.02.10 |
[Gradle] build.gradle sourceSet 설정 (feat. resource 디렉터리와 mapper) (0) | 2024.10.19 |
public String test(Model model) 에서 model은 왜 리턴타입이 아닌 파라미터로 있는걸까요 (0) | 2024.10.15 |