Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- GIT
- Kernighan의 C언어 프로그래밍
- 코드로배우는스프링웹프로젝트
- 처음 만나는 AI수학 with Python
- 스프링부트핵심가이드
- baeldung
- network configuration
- d
- 구멍가게코딩단
- ㅒ
- 목록처리
- 자료구조와함께배우는알고리즘입문
- 리눅스
- 페이징
- 네트워크 설정
- /etc/network/interfaces
- resttemplate
- 처음 만나는 AI 수학 with Python
- 코드로배우는스프링부트웹프로젝트
- 자료구조와 함께 배우는 알고리즘 입문
- iterator
- 데비안
- 선형대수
- 이터레이터
- 스프링 시큐리티
- 티스토리 쿠키 삭제
- 친절한SQL튜닝
- 자바편
- 서버설정
- 알파회계
Archives
- Today
- Total
bright jazz music
blog 26 : 가장 기본적인 요청 인증값 확인 본문
서버 입장에서는 들어온 요청의 인증 여부만 확인하여 인증이 된 요청이라면 API를 사용하도록 해주면 된다.
- 새로운 기능을 추가할 때 과거에 작성한 코드가 맘에 들지 않을 수 있다. 그럴 때는 현재 내가 작성하려는 기능을 거기에 덧붙이지 말고, 과거의 코드를 리팩토링 한 뒤에 추가하는 버릇을 들이자. 그렇지 않는다면 레거시 코드로 남는 것이다. 리팩토링은 시간을 내서 하는 것이 아니다.
인증을 하는 방법
//PostControllerTest.java
@Test
@DisplayName("글 작성 요청시 DB에 값이 저장된다.")
void test3() throws Exception {
//given
PostCreate request = PostCreate.builder()
.title("제목입니다.")
.content("내용입니다.")
.build();
// ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(request);
//현재는 아무나 이런 요청을 전송할 수 있다. 인증을 추가해야 한다.
mockMvc.perform(post("/posts")
.contentType(APPLICATION_JSON)
.content(json)
)
.andExpect(status().isOk())
.andDo(print());
//then
assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치
//DB에 잘 들어갔는지 확인
Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
assertEquals("제목입니다.", post.getTitle());
assertEquals("내용입니다.", post.getContent());
}
//인증 방법
//1. GET Parameter
//2. POST(body) value : 사용하지 않을 예쩡. PostCreate에 인증 코드를 추가해야 해서 설계가 무너진다. private String authrozation 같은.
//3. Header로 받는 방법
1. get parameter 방식 :
리소스를 식별하기 위한 주소에 그 의도와 맞지 않는 값(RequestParam)이 들어가게 되어 잘 사용하지 않는다.
//PostController.java
@PostMapping("/posts")
public void post(@RequestBody @Valid PostCreate request, @RequestParam(required = true) String authorization) { //기본값이 true
// @RequestParam은 기본값이 true . 생략가능
if (authorization.equals("catnails")){
request.validate(); //검증
postService.write(request);
}
}
//PostControllerTest.java
@Test
@DisplayName("글 작성 요청시 DB에 값이 저장된다.")
void test3() throws Exception {
//given
PostCreate request = PostCreate.builder()
.title("제목입니다.")
.content("내용입니다.")
.build();
// ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(request);
String requestParam = "catnails";
//현재는 아무나 이런 요청을 전송할 수 있다. 인증을 추가해야 한다.
mockMvc.perform(post("/posts?authorization={auth}", requestParam)
.contentType(APPLICATION_JSON)
.content(json)
)
.andExpect(status().isOk())
.andDo(print());
//then
assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치
//DB에 잘 들어갔는지 확인
Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
assertEquals("제목입니다.", post.getTitle());
assertEquals("내용입니다.", post.getContent());
}
//////////////////
MockHttpServletRequest:
HTTP Method = POST
Request URI = /posts
Parameters = {authorization=[catnails]}
Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
Body = {"title":"제목입니다.","content":"내용입니다."}
Session Attrs = {}
2. POST(body) value
사용하지 않을 예정.
PostCreate에 인증 코드를 추가해야 해서 설계가 무너진다. private String authrozation 같은 필드가 추가되면 PostCreate를 사용하는 다른 코드에서도 수정해 줘야할 필요가 생길 수도 있다..
3. header로 인증하는 방법
RequestParam 대신 RequestHedear로 받는다.
//PostController.java
@PostMapping("/posts")
public void post(@RequestBody @Valid PostCreate request, @RequestHeader(required = true) String authorization) {
if (authorization.equals("catnails")){
request.validate(); //검증
postService.write(request);
}
@Test
@DisplayName("글 작성 요청시 DB에 값이 저장된다.")
void test3() throws Exception {
//given
PostCreate request = PostCreate.builder()
.title("제목입니다.")
.content("내용입니다.")
.build();
// ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(request);
String requestHeader = "catnails";
mockMvc.perform(post("/posts")
.header("authorization", requestHeader)
.contentType(APPLICATION_JSON)
.content(json)
)
.andExpect(status().isOk())
.andDo(print());
//then
assertEquals(1L, postRepository.count()); //하나의 값이 있을 거라고 예상. 일치
//DB에 잘 들어갔는지 확인
Post post = postRepository.findAll().get(0); //가장 처음 데이터 가져옴
assertEquals("제목입니다.", post.getTitle());
assertEquals("내용입니다.", post.getContent());
}
/////////////
MockHttpServletRequest:
HTTP Method = POST
Request URI = /posts
Parameters = {}
Headers = [Content-Type:"application/json;charset=UTF-8", authorization:"catnails", Content-Length:"57"]
Body = {"title":"제목입니다.","content":"내용입니다."}
Session Attrs = {}
Handler:
Type = com.endofma.blog.controller.PostController
Method = com.endofma.blog.controller.PostController#post(PostCreate, String)
이러한 방식이 가장 기본적인 인증방식이다. 물론 취약하긴 하다.
문제는 이런 식으로 여러 개 API에 코드를 추가하기가 번거롭다는 것이다.
따라서 다음 포스팅에서는 interceptor를 사용하여 모든 api에 적용될 수 있는 인증방식을 사용한다.
'Projects > blog' 카테고리의 다른 글
blog 28 : ArgumentResolver 사용해보기 (0) | 2023.02.10 |
---|---|
blog 27 : Interceptor 사용해 보기 (0) | 2023.02.09 |
blog 24 : 애플리케이션 프로세스 유지하기 (0) | 2023.02.08 |
blog21 : 배포 준비(빌드) (0) | 2023.02.06 |
blog22 : 화면 꾸미기 (0) | 2023.02.04 |
Comments