0. 아키텍쳐
1. 기술 스택
- Spring security(OAuth2) : 인증, 권한, 인가
- 초기 Grant Type : password , TokenStore : Inmemory(JVM)
- 확장 Grant Type : Authorization Code, TokenStore : JVM -> JDBC -> Redis
- Spring Boot
- Spring MVC
- Spring data JPA : ORM
- Spring HATEOAS : RESTful
- Spring REST Docs : RESTful
2. 패러다임
- TDD(테스트코드 보기)
- Unit Test
- Slicing Test
- Application Test
- REST
- MSA // TODO
4. 인증과정
- /oauth/token 로 POST 요청
- basic 요청으로 clientId("myApp")와 clientPass("pass") 를 포함
- "username", "password", "grant_type"
- "username" 은 사용자의 email, "password"는 비밀번호 , "grant_type"은 "password"로 고정
Headers =
[
Authorization:"Basic bXlBcHA6cGFzcw=="
]
Parameters =
{
username : "[user@email.com]",
password : "[user]",
grant_type : "password"
}
// 토큰 예시
{
"access_token":"f253ac88-d30b-498e-8f8b-abec71d64881",
"token_type":"bearer",
"refresh_token":"3e986a5d-5422-49f9-a4c3-4c3aeb8230fe",
"expires_in":599,
"scope":"read write",
}
- 인증이 필요한 로직에 접근할 때 Header에 token_type + access_token을 포함시킨다
Headers =
[
Content-Type:"application/json;charset=UTF-8",
Authorization:"bearer f253ac88-d30b-498e-8f8b-abec71d64881",
Accept:"application/hal+json"
]
5. API 접근 flow
- form data or axios 등으로 /api 에 GET 요청을 보낸다.
/* Response Message */
{
"_links": {
"boards": {
"href":"http://localhost:8080/api/boards"
}
}
}
- Response message의 _links.boards.href 를 통해 GET 요청을 보내면 다음과 같은 메시지를 받는다.
{
"_links": {
"self": {
"href": "http://localhost:8080/api/boards?page=0&size=20"
},
"profile": {
"href": "/docs/index.html#resources-boards-list"
},
/* 로그인 했을 때만 보여짐 */
"create-board": {
"href": "http://localhost:8080/api/boards"
}
},
"page": {
"size": 20,
"totalElements": 0,
"totalPages": 0,
"number": 0
}
}
- _links.create-board 를 통해 게시물 생성가능
/* Request Message */
{
"title" : "Test Title",
"contents" : "test contents",
"boardType" :"PORTFOLIO"
}
/* Response Message */
{
"id": 3,
"title": "Test Title",
"contents": "test contents",
"createdDateTime": "2019-08-05T14:25:56.6192144",
"modifiedDateTime": null,
"boardType": "PORTFOLIO",
"manager": {
"id": 1,
"role": "[USER]"
},
"_links": {
"self": {
"href": "http://localhost:8080/api/boards/3"
},
"query-boards": {
"href": "http://localhost:8080/api/boards"
},
"update-board": {
"href": "http://localhost:8080/api/boards/3"
},
"delete-board": {
"href:": "http://localhost:8080/api/boards/3"
},
"profile": {
"href": "/docs/index.html#resources-boards-create"
}
}
}
- 응답받은 메시지의 URI로 CRUD 를 할 수 있다.